AutoProcessing.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. using Photon.Pun;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using UnityEngine;
  7. public class AutoProcessing : MonoBehaviourPunCallbacks
  8. {
  9. //Skill list before triggering and entering resolution timing
  10. public List<SkillInfo> StackedSkillInfos { get; set; } = new List<SkillInfo>();
  11. //Skill Processing Component List
  12. public List<MultipleSkills> multipleSkills = new List<MultipleSkills>();
  13. [SerializeField] bool SkipSameEffect;
  14. public List<SkillInfo> skipSkillInfos = new List<SkillInfo>();
  15. #region Available Skill Processing Component
  16. public MultipleSkills availableMultipleSkills
  17. {
  18. get
  19. {
  20. foreach (MultipleSkills _multipleSkills in multipleSkills)
  21. {
  22. if (!_multipleSkills.IsUsing)
  23. {
  24. return _multipleSkills;
  25. }
  26. }
  27. return null;
  28. }
  29. }
  30. #endregion
  31. #region Stack during effect processing
  32. public MultipleSkills executingMultipleSkills
  33. {
  34. get
  35. {
  36. for (int i = 0; i < multipleSkills.Count; i++)
  37. {
  38. if (multipleSkills[multipleSkills.Count - 1 - i].IsUsing)
  39. {
  40. return multipleSkills[multipleSkills.Count - 1 - i];
  41. }
  42. }
  43. return null;
  44. }
  45. }
  46. #endregion
  47. #region put the effect on the stack
  48. public void PutStackedSkill(SkillInfo skillInfo)
  49. {
  50. if (skillInfo == null) return;
  51. if (skillInfo.CardEffect == null) return;
  52. if (skillInfo.CardEffect.EffectSourceCard == null) return;
  53. if (!(skillInfo.CardEffect is ActivateICardEffect)) return;
  54. CardSource card = skillInfo.CardEffect.EffectSourceCard;
  55. Permanent permanent = card.PermanentOfThisCard();
  56. #region set the flag whether it is Digimon's effect
  57. if (permanent != null)
  58. {
  59. if (permanent.IsDigimon)
  60. {
  61. skillInfo.CardEffect.SetIsDigimonEffect(true);
  62. }
  63. }
  64. if (card == GManager.instance.attackProcess.SecurityDigimon)
  65. {
  66. skillInfo.CardEffect.SetIsDigimonEffect(true);
  67. }
  68. #endregion
  69. #region set the flag whether it is Tamer's effect
  70. if (permanent != null)
  71. {
  72. if (permanent.IsTamer)
  73. {
  74. skillInfo.CardEffect.SetIsTamerEffect(true);
  75. }
  76. }
  77. else if (card.IsTamer)
  78. {
  79. skillInfo.CardEffect.SetIsTamerEffect(true);
  80. }
  81. #endregion
  82. #region set permanent and topCard when triggered
  83. ((ActivateICardEffect)skillInfo.CardEffect).PermanentWhenTriggered = permanent;
  84. if (permanent != null)
  85. {
  86. ((ActivateICardEffect)skillInfo.CardEffect).TopCardWhenTriggered = permanent.TopCard;
  87. }
  88. #endregion
  89. StackedSkillInfos.Add(skillInfo);
  90. }
  91. #endregion
  92. #region Automated processing checks
  93. public IEnumerator AutoProcessCheck()
  94. {
  95. if (!GManager.instance.turnStateMachine.DoneStartGame) yield break;
  96. yield return ContinuousController.instance.StartCoroutine(ShrinkSecurityDigimonDisplay());
  97. GManager.instance.turnStateMachine.IsSelecting = true;
  98. GManager.instance.turnStateMachine.isSync = true;
  99. //Rule processing
  100. yield return ContinuousController.instance.StartCoroutine(RuleProcess());
  101. //Trigger effect processing
  102. yield return ContinuousController.instance.StartCoroutine(TriggeredSkillProcess(false, null));
  103. GManager.instance.turnStateMachine.IsSelecting = false;
  104. GManager.instance.turnStateMachine.isSync = false;
  105. }
  106. #endregion
  107. #region Rule processing
  108. public bool IsRuleProcessing { get; set; } = false;
  109. bool IsNotHavingDP(Permanent permanent)
  110. {
  111. if (permanent != null)
  112. {
  113. if (permanent.TopCard != null)
  114. {
  115. if (permanent.DP < 0)
  116. {
  117. if (permanent.IsPlaceToTrashDueToNotHavingDP)
  118. {
  119. if (permanent.IsDigimon)
  120. {
  121. return true;
  122. }
  123. if (permanent.TopCard.IsOption)
  124. {
  125. if (!permanent.IsPlayedOptionPermanent)
  126. {
  127. return true;
  128. }
  129. }
  130. }
  131. }
  132. }
  133. }
  134. return false;
  135. }
  136. bool IsDigimonLackDP(Permanent permanent)
  137. {
  138. if (permanent != null)
  139. {
  140. if (permanent.TopCard != null)
  141. {
  142. if (permanent.DP == 0)
  143. {
  144. if (permanent.IsDigimon)
  145. {
  146. if (permanent.CanBeDestroyed())
  147. {
  148. return true;
  149. }
  150. }
  151. }
  152. }
  153. }
  154. return false;
  155. }
  156. public IEnumerator RuleProcess()
  157. {
  158. while (DoRuleProcess())
  159. {
  160. IsRuleProcessing = true;
  161. //敗北処理
  162. yield return ContinuousController.instance.StartCoroutine(EndGameProcess());
  163. if (GManager.instance.turnStateMachine.endGame) yield break;
  164. //DPを持たないカードをトラッシュする処理
  165. yield return ContinuousController.instance.StartCoroutine(TrashNoDPPermanentProcess());
  166. //DP不足処理
  167. yield return ContinuousController.instance.StartCoroutine(DigimonLackDPProcess());
  168. IsRuleProcessing = false;
  169. }
  170. }
  171. #region Whether rule processing needs to be done
  172. bool DoRuleProcess()
  173. {
  174. if (IsRuleProcessing) return false;
  175. #region Whether it is necessary to perform game end processing
  176. if (GManager.instance.turnStateMachine.gameContext.Players.Count(player => player.IsLose) >= 1)
  177. {
  178. return true;
  179. }
  180. #endregion
  181. #region Is it necessary to discard cards without DP?
  182. if (CardEffectCommons.HasMatchConditionPermanent(IsNotHavingDP))
  183. {
  184. return true;
  185. }
  186. #endregion
  187. #region Is it necessary to deal with Digimon's DP shortage?
  188. if (CardEffectCommons.HasMatchConditionPermanent(IsDigimonLackDP))
  189. {
  190. return true;
  191. }
  192. #endregion
  193. return false;
  194. }
  195. #endregion
  196. #region Each rule processing
  197. #region Game end processing
  198. IEnumerator EndGameProcess()
  199. {
  200. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  201. {
  202. if (player.IsLose)
  203. {
  204. if (!player.Enemy.IsLose)
  205. {
  206. GManager.instance.turnStateMachine.EndGame(player.Enemy, false);
  207. }
  208. else
  209. {
  210. GManager.instance.turnStateMachine.EndGame(null, false);
  211. }
  212. yield break;
  213. }
  214. }
  215. }
  216. #endregion
  217. #region Process of trashing cards without DP
  218. IEnumerator TrashNoDPPermanentProcess()
  219. {
  220. List<Permanent> DigitamaPermanents = GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer
  221. .Map(player => player.GetBattleAreaPermanents()
  222. .Filter(IsNotHavingDP)).Flat();
  223. if (DigitamaPermanents.Count >= 1)
  224. {
  225. foreach (Permanent permanent in DigitamaPermanents)
  226. {
  227. if (permanent != null)
  228. {
  229. if (permanent.TopCard != null)
  230. {
  231. yield return ContinuousController.instance.StartCoroutine(permanent.DiscardEvoRoots());
  232. CardSource cardSource = permanent.TopCard;
  233. yield return ContinuousController.instance.StartCoroutine(GManager.instance.GetComponent<Effects>().ShowCardEffect(new List<CardSource>() { cardSource }, "Cards put to trash", true, true));
  234. yield return ContinuousController.instance.StartCoroutine(CardObjectController.RemoveField(permanent));
  235. yield return ContinuousController.instance.StartCoroutine(CardObjectController.AddTrashCard(cardSource));
  236. }
  237. }
  238. }
  239. }
  240. }
  241. #endregion
  242. #region Digimon DP shortage handling
  243. IEnumerator DigimonLackDPProcess()
  244. {
  245. List<Permanent> LackPowerPermanents = GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer
  246. .Map(player => player.GetFieldPermanents()
  247. .Filter(IsDigimonLackDP)).Flat();
  248. if (LackPowerPermanents.Count >= 1)
  249. {
  250. Hashtable hashtable = new Hashtable()
  251. {
  252. { "DPZero", true }
  253. };
  254. yield return ContinuousController.instance.StartCoroutine(new DestroyPermanentsClass(LackPowerPermanents, hashtable).Destroy());
  255. }
  256. }
  257. #endregion
  258. #endregion
  259. #endregion
  260. #region Trigger effect processing
  261. public IEnumerator TriggeredSkillProcess(bool CheckNewTriggredSkill_mainStack, Func<List<SkillInfo>, SkillInfo, bool> skipCondition)
  262. {
  263. yield return ContinuousController.instance.StartCoroutine(ShrinkSecurityDigimonDisplay());
  264. if (StackedSkillInfos.Count > 0)
  265. {
  266. List<SkillInfo> skillInfos = StackedSkillInfos.Filter(skillInfo => skillInfo != null && !skipSkillInfos.Contains(skillInfo));
  267. if (skillInfos.Count >= 1)
  268. {
  269. //Clear the list of triggering skills not included in the resolution timing
  270. foreach (SkillInfo skillInfo in skillInfos)
  271. {
  272. StackedSkillInfos.Remove(skillInfo);
  273. }
  274. //Process the list of skills being triggered
  275. if (availableMultipleSkills != null)
  276. {
  277. yield return ContinuousController.instance.StartCoroutine(availableMultipleSkills.ActivateMultipleSkills(
  278. skillInfos,
  279. this,
  280. CheckNewTriggredSkill_mainStack,
  281. skipCondition));
  282. }
  283. yield return ContinuousController.instance.StartCoroutine(StackSkillInfos(null, EffectTiming.AfterEffectsActivate));
  284. }
  285. }
  286. }
  287. #endregion
  288. #region List of effects already achieved
  289. public List<SkillInfo> skillInfos_used
  290. {
  291. get
  292. {
  293. List<SkillInfo> skillInfos_used = new List<SkillInfo>();
  294. foreach (MultipleSkills multipleSkills in multipleSkills)
  295. {
  296. foreach (SkillInfo skillInfo in multipleSkills.SkillInfos_used)
  297. {
  298. skillInfos_used.Add(skillInfo);
  299. }
  300. }
  301. return skillInfos_used;
  302. }
  303. }
  304. #endregion
  305. #region The same effect has already been achieved
  306. public static bool HasExecutedSameEffect(List<SkillInfo> skillInfos, SkillInfo skillInfo)
  307. {
  308. return skillInfos.Some((skillInfo1) => skillInfo1.CardEffect.IsSameEffect(skillInfo.CardEffect));
  309. }
  310. #endregion
  311. #region Check end of turn
  312. public IEnumerator EndTurnCheck()
  313. {
  314. if (GManager.instance.turnStateMachine.gameContext.TurnPhase != GameContext.phase.End)
  315. {
  316. if (GManager.instance.turnStateMachine.gameContext.NonTurnPlayer.MemoryForPlayer >= TurnEndMinMemory)
  317. {
  318. GManager.instance.turnStateMachine.Passed = false;
  319. yield return ContinuousController.instance.StartCoroutine(GManager.instance.autoProcessing.EndTurnProcess());
  320. }
  321. }
  322. }
  323. #endregion
  324. #region Minimum memory to end turn
  325. static int TurnEndMinMemory
  326. {
  327. get
  328. {
  329. int turnEndMinMemory = 1;
  330. #region the effects of players
  331. GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer
  332. .Map(player => player.EffectList(EffectTiming.None))
  333. .Flat()
  334. .Filter(cardEffect => cardEffect is IChangeEndTurnMinMemoryEffect && cardEffect.CanUse(null))
  335. .ForEach(cardEffect => turnEndMinMemory = ((IChangeEndTurnMinMemoryEffect)cardEffect).GetMinMemory(turnEndMinMemory));
  336. #endregion
  337. #region the effects of permanents
  338. GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer
  339. .Map(player => player.GetFieldPermanents())
  340. .Flat()
  341. .Map(permanent => permanent.EffectList(EffectTiming.None))
  342. .Flat()
  343. .Filter(cardEffect => cardEffect is IChangeEndTurnMinMemoryEffect && cardEffect.CanUse(null))
  344. .ForEach(cardEffect => turnEndMinMemory = ((IChangeEndTurnMinMemoryEffect)cardEffect).GetMinMemory(turnEndMinMemory));
  345. #endregion
  346. return turnEndMinMemory;
  347. }
  348. }
  349. #endregion
  350. #region Turn end processing
  351. public IEnumerator EndTurnProcess()
  352. {
  353. if (GManager.instance.turnStateMachine.gameContext.TurnPhase != GameContext.phase.End)
  354. {
  355. GManager.instance.turnStateMachine.isSync = true;
  356. // yield return GManager.instance.photonWaitController.StartWait("EndTurnProcess");
  357. if (GManager.instance.turnStateMachine.Passed && GManager.instance.turnStateMachine.gameContext.TurnPhase == GameContext.phase.Main)
  358. {
  359. if (GManager.instance.turnStateMachine.gameContext.TurnPlayer.PlayerID == 0)
  360. {
  361. GManager.instance.turnStateMachine.gameContext.Memory = 3;
  362. }
  363. else
  364. {
  365. GManager.instance.turnStateMachine.gameContext.Memory = -3;
  366. }
  367. yield return ContinuousController.instance.StartCoroutine(GManager.instance.memoryObject.SetMemory());
  368. }
  369. GManager.instance.turnStateMachine.Passed = true;
  370. //Effect at end of turn
  371. yield return ContinuousController.instance.StartCoroutine(StackSkillInfos(null, EffectTiming.OnEndTurn));
  372. //Automatic processing check timing
  373. yield return ContinuousController.instance.StartCoroutine(GManager.instance.autoProcessing.AutoProcessCheck());
  374. if (GManager.instance.turnStateMachine.gameContext.NonTurnPlayer.MemoryForPlayer >= TurnEndMinMemory)
  375. {
  376. GManager.instance.turnStateMachine.gameContext.TurnPhase = GameContext.phase.End;
  377. }
  378. else
  379. {
  380. GManager.instance.turnStateMachine.isSync = false;
  381. if (GManager.instance.turnStateMachine.gameContext.TurnPhase == GameContext.phase.Main)
  382. {
  383. StartCoroutine(GManager.instance.turnStateMachine.SetMainPhase());
  384. }
  385. }
  386. }
  387. }
  388. #endregion
  389. #region Shrink security Digimon display
  390. public IEnumerator ShrinkSecurityDigimonDisplay()
  391. {
  392. if (!HasAwaitingActivateEffects()) yield break;
  393. if (GManager.instance.attackProcess.IsAttacking)
  394. {
  395. if (GManager.instance.attackProcess.SecurityDigimon != null)
  396. {
  397. if (GManager.instance.GetComponent<Effects>().ShowUseHandCard.gameObject.activeSelf && GManager.instance.GetComponent<Effects>().ShowUseHandCard.cardSource == GManager.instance.attackProcess.SecurityDigimon)
  398. {
  399. yield return ContinuousController.instance.StartCoroutine(GManager.instance.GetComponent<Effects>().MoveToExecuteCardEffect(GManager.instance.attackProcess.SecurityDigimon));
  400. yield return ContinuousController.instance.StartCoroutine(GManager.instance.attackProcess.SecurityDigimon.Owner.brainStormObject.BrainStormCoroutine(GManager.instance.attackProcess.SecurityDigimon));
  401. }
  402. }
  403. }
  404. }
  405. #endregion
  406. #region Whether there is awaiting activate effects
  407. public bool HasAwaitingActivateEffects()
  408. {
  409. if (StackedSkillInfos.Count >= 2)
  410. {
  411. return true;
  412. }
  413. else if (StackedSkillInfos.Count == 1)
  414. {
  415. if (StackedSkillInfos[0].CardEffect.CanActivate(StackedSkillInfos[0].Hashtable))
  416. {
  417. return true;
  418. }
  419. }
  420. return false;
  421. }
  422. #endregion
  423. #region Get skillInfos
  424. public static List<SkillInfo> GetSkillInfos(Hashtable hashtable, EffectTiming timing, Func<ICardEffect, bool> cardEffectCondition = null)
  425. {
  426. List<SkillInfo> skillInfos = new List<SkillInfo>();
  427. #region player effect
  428. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  429. {
  430. foreach (ICardEffect cardEffect in player.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  431. {
  432. if (cardEffect is ActivateICardEffect)
  433. {
  434. if (!cardEffect.IsBackgroundProcess)
  435. {
  436. if (cardEffect.CanTrigger(hashtable))
  437. {
  438. skillInfos.Add(new SkillInfo(cardEffect, hashtable, timing));
  439. }
  440. }
  441. }
  442. }
  443. }
  444. #endregion
  445. #region Effects of permanents in play
  446. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  447. {
  448. foreach (Permanent permanent in player.GetFieldPermanents())
  449. {
  450. foreach (ICardEffect cardEffect in permanent.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  451. {
  452. if (cardEffect is ActivateICardEffect)
  453. {
  454. if (!cardEffect.IsBackgroundProcess)
  455. {
  456. if (cardEffect.CanTrigger(hashtable))
  457. {
  458. skillInfos.Add(new SkillInfo(cardEffect, hashtable, timing));
  459. }
  460. }
  461. }
  462. }
  463. }
  464. }
  465. #endregion
  466. #region Trash card effect
  467. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  468. {
  469. foreach (CardSource cardSource in player.TrashCards)
  470. {
  471. foreach (ICardEffect cardEffect in cardSource.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  472. {
  473. if (cardEffect is ActivateICardEffect)
  474. {
  475. if (!cardEffect.IsBackgroundProcess)
  476. {
  477. if (cardEffect.CanTrigger(hashtable))
  478. {
  479. skillInfos.Add(new SkillInfo(cardEffect, hashtable, timing));
  480. }
  481. }
  482. }
  483. }
  484. }
  485. }
  486. #endregion
  487. #region Effects of cards in hand
  488. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  489. {
  490. foreach (CardSource cardSource in player.HandCards)
  491. {
  492. foreach (ICardEffect cardEffect in cardSource.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  493. {
  494. if (cardEffect is ActivateICardEffect)
  495. {
  496. if (!cardEffect.IsBackgroundProcess)
  497. {
  498. if (cardEffect.CanTrigger(hashtable))
  499. {
  500. skillInfos.Add(new SkillInfo(cardEffect, hashtable, timing));
  501. }
  502. }
  503. }
  504. }
  505. }
  506. }
  507. #endregion
  508. return skillInfos;
  509. }
  510. #endregion
  511. #region Activate background effects
  512. public static IEnumerator ActivateBackgroundEffects(Hashtable hashtable, EffectTiming timing, Func<ICardEffect, bool> cardEffectCondition = null)
  513. {
  514. #region Player effect
  515. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  516. {
  517. foreach (ICardEffect cardEffect in player.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  518. {
  519. if (cardEffect is ActivateICardEffect)
  520. {
  521. if (cardEffect.IsBackgroundProcess)
  522. {
  523. if (cardEffect.CanUse(hashtable))
  524. {
  525. cardEffect.EffectSourceCard.cEntity_EffectController.RegisterUseEfffectThisTurn(cardEffect);
  526. yield return ContinuousController.instance.StartCoroutine(((ActivateICardEffect)cardEffect).Activate(hashtable));
  527. }
  528. }
  529. }
  530. }
  531. }
  532. #endregion
  533. #region Effects of permanents in play
  534. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  535. {
  536. foreach (Permanent permanent in player.GetFieldPermanents())
  537. {
  538. foreach (ICardEffect cardEffect in permanent.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  539. {
  540. if (cardEffect is ActivateICardEffect)
  541. {
  542. if (cardEffect.IsBackgroundProcess)
  543. {
  544. if (cardEffect.CanUse(hashtable))
  545. {
  546. cardEffect.EffectSourceCard.cEntity_EffectController.RegisterUseEfffectThisTurn(cardEffect);
  547. yield return ContinuousController.instance.StartCoroutine(((ActivateICardEffect)cardEffect).Activate(hashtable));
  548. }
  549. }
  550. }
  551. }
  552. }
  553. }
  554. #endregion
  555. #region Trash card effect
  556. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  557. {
  558. foreach (CardSource cardSource in player.TrashCards)
  559. {
  560. foreach (ICardEffect cardEffect in cardSource.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  561. {
  562. if (cardEffect is ActivateICardEffect)
  563. {
  564. if (cardEffect.IsBackgroundProcess)
  565. {
  566. if (cardEffect.CanUse(hashtable))
  567. {
  568. cardEffect.EffectSourceCard.cEntity_EffectController.RegisterUseEfffectThisTurn(cardEffect);
  569. yield return ContinuousController.instance.StartCoroutine(((ActivateICardEffect)cardEffect).Activate(hashtable));
  570. }
  571. }
  572. }
  573. }
  574. }
  575. }
  576. #endregion
  577. #region Effects of cards in hand
  578. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  579. {
  580. foreach (CardSource cardSource in player.HandCards)
  581. {
  582. foreach (ICardEffect cardEffect in cardSource.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  583. {
  584. if (cardEffect is ActivateICardEffect)
  585. {
  586. if (cardEffect.IsBackgroundProcess)
  587. {
  588. if (cardEffect.CanUse(hashtable))
  589. {
  590. cardEffect.EffectSourceCard.cEntity_EffectController.RegisterUseEfffectThisTurn(cardEffect);
  591. yield return ContinuousController.instance.StartCoroutine(((ActivateICardEffect)cardEffect).Activate(hashtable));
  592. }
  593. }
  594. }
  595. }
  596. }
  597. }
  598. #endregion
  599. }
  600. #endregion
  601. #region Stack skillInfos
  602. public IEnumerator StackSkillInfos(Hashtable hashtable, EffectTiming timing, Func<ICardEffect, bool> cardEffectCondition = null)
  603. {
  604. GetSkillInfos(hashtable, timing, cardEffectCondition).ForEach(skillInfo => PutStackedSkill(skillInfo));
  605. yield return ContinuousController.instance.StartCoroutine(ActivateBackgroundEffects(hashtable, timing, cardEffectCondition));
  606. }
  607. #endregion
  608. #region Get skillInfos of cards
  609. public static List<SkillInfo> GetSkillInfosOfCards(Hashtable hashtable, EffectTiming timing, List<CardSource> cardSources, Func<ICardEffect, bool> cardEffectCondition = null)
  610. {
  611. List<SkillInfo> skillInfos = new List<SkillInfo>();
  612. #region カードリストの効果
  613. foreach (CardSource cardSource in cardSources)
  614. {
  615. if (cardSource.PermanentOfThisCard() == null)
  616. {
  617. foreach (ICardEffect cardEffect in cardSource.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  618. {
  619. if (cardEffect is ActivateICardEffect)
  620. {
  621. if (!cardEffect.IsBackgroundProcess)
  622. {
  623. if (cardEffect.CanTrigger(hashtable))
  624. {
  625. skillInfos.Add(new SkillInfo(cardEffect, hashtable, timing));
  626. }
  627. }
  628. }
  629. }
  630. }
  631. }
  632. #endregion
  633. return skillInfos;
  634. }
  635. #endregion
  636. #region Activate background effects of cards
  637. public static IEnumerator ActivateBackgroundEffectsOfCards(Hashtable hashtable, EffectTiming timing, List<CardSource> cardSources, Func<ICardEffect, bool> cardEffectCondition = null)
  638. {
  639. #region Effect of card list
  640. foreach (CardSource cardSource in cardSources)
  641. {
  642. if (cardSource.PermanentOfThisCard() == null)
  643. {
  644. foreach (ICardEffect cardEffect in cardSource.EffectList(timing).Filter(cardEffect => cardEffectCondition == null || cardEffectCondition(cardEffect)))
  645. {
  646. if (cardEffect is ActivateICardEffect)
  647. {
  648. if (cardEffect.IsBackgroundProcess)
  649. {
  650. if (cardEffect.CanUse(hashtable))
  651. {
  652. cardEffect.EffectSourceCard.cEntity_EffectController.RegisterUseEfffectThisTurn(cardEffect);
  653. yield return ContinuousController.instance.StartCoroutine(((ActivateICardEffect)cardEffect).Activate(hashtable));
  654. }
  655. }
  656. }
  657. }
  658. }
  659. }
  660. #endregion
  661. }
  662. #endregion
  663. #region Stack skillInfos of cards
  664. public IEnumerator StackSkillInfosOfCards(Hashtable hashtable, EffectTiming timing, List<CardSource> cardSources, Func<ICardEffect, bool> cardEffectCondition = null)
  665. {
  666. GetSkillInfosOfCards(hashtable, timing, cardSources, cardEffectCondition).ForEach(skillInfo => PutStackedSkill(skillInfo));
  667. yield return ContinuousController.instance.StartCoroutine(ActivateBackgroundEffectsOfCards(hashtable, timing, cardSources, cardEffectCondition));
  668. }
  669. #endregion
  670. public ICardEffect MainProcessingEffect { get; private set; } = null;
  671. List<ICardEffect> _usedCutinEffects = new List<ICardEffect>();
  672. public IEnumerator ActivateEffectProcess(ICardEffect cardEffect, Hashtable hashtable, bool isCheckOptional = true)
  673. {
  674. if (cardEffect == null) yield break;
  675. if (!(cardEffect is ActivateICardEffect)) yield break;
  676. if (cardEffect.CanActivate(hashtable) || cardEffect.IsDeclarative)
  677. {
  678. bool isEffectProcessing = MainProcessingEffect != null;
  679. if (!isEffectProcessing)
  680. {
  681. MainProcessingEffect = cardEffect;
  682. _usedCutinEffects = new List<ICardEffect>();
  683. }
  684. yield return ContinuousController.instance.StartCoroutine(((ActivateICardEffect)cardEffect).Activate_Optional_Effect_Execute(hashtable, isCheckOptional));
  685. if (!isEffectProcessing)
  686. {
  687. MainProcessingEffect = null;
  688. _usedCutinEffects = new List<ICardEffect>();
  689. }
  690. }
  691. }
  692. public bool IsCutInEffectHasUsed(ICardEffect cutinEffect)
  693. {
  694. return false;//TODO: General line 17 - _usedCutinEffects.Some(cardEffect => cardEffect.IsSameEffect(cutinEffect));
  695. }
  696. public bool IsCutInEffectUsedMaxCount(ICardEffect cutinEffect)
  697. {
  698. return _usedCutinEffects.Count(cardEffect => cardEffect.IsSameEffect(cutinEffect)) < cutinEffect.ChainActivations;
  699. }
  700. public void AddCutinEffect(ICardEffect cardEffect)
  701. {
  702. if (GManager.instance.autoProcessing.MainProcessingEffect != null)
  703. {
  704. _usedCutinEffects.Add(cardEffect);
  705. }
  706. }
  707. }