CardEffectCommons.cs 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine;
  6. public partial class CardEffectCommons
  7. {
  8. #region Digivolution Requirements
  9. public enum IgnoreRequirement
  10. {
  11. None,
  12. All,
  13. Level,
  14. Color
  15. }
  16. #endregion
  17. #region Play cards as new permanents
  18. public static IEnumerator PlayPermanentCards(List<CardSource> cardSources, ICardEffect activateClass, bool payCost, bool isTapped, SelectCardEffect.Root root, bool activateETB, bool isBreedingArea = false, int fixedCost = -1)
  19. {
  20. if (cardSources == null) yield break;
  21. cardSources = cardSources
  22. .Filter(cardSource => cardSource != null)
  23. .Filter(cardSource => CanPlayAsNewPermanent(
  24. cardSource: cardSource,
  25. payCost: payCost,
  26. cardEffect: activateClass,
  27. isBreedingArea: isBreedingArea,
  28. fixedCost: fixedCost));
  29. if (cardSources.Count == 0) yield break;
  30. PlayCardClass playCardClass = new PlayCardClass(
  31. cardSources: cardSources,
  32. hashtable: CardEffectHashtable(activateClass),
  33. payCost: payCost,
  34. targetPermanent: null,
  35. isTapped: isTapped,
  36. root: root,
  37. activateETB: activateETB);
  38. if (isBreedingArea)
  39. playCardClass.SetIsBreedingArea();
  40. playCardClass.SetFixedCost(fixedCost);
  41. yield return ContinuousController.instance.StartCoroutine(playCardClass.PlayCard());
  42. }
  43. #endregion
  44. #region Play option cards
  45. public static IEnumerator PlayOptionCards(List<CardSource> cardSources, ICardEffect activateClass, bool payCost, SelectCardEffect.Root root,
  46. bool setAddSecurityEndOption = false)
  47. {
  48. if (cardSources == null) yield break;
  49. Func<EffectTiming, ICardEffect> getEffect = null;
  50. cardSources = cardSources
  51. .Filter(cardSource => cardSource != null)
  52. .Filter(cardSource => !cardSource.CanNotPlayThisOption);
  53. if (cardSources.Count == 0) yield break;
  54. PlayCardClass playCard = new PlayCardClass(
  55. cardSources: cardSources,
  56. hashtable: CardEffectHashtable(activateClass),
  57. payCost: payCost,
  58. targetPermanent: null,
  59. isTapped: false,
  60. root: root,
  61. activateETB: true);
  62. if (activateClass != null)
  63. {
  64. playCard.SetShowEffect();
  65. if (setAddSecurityEndOption)
  66. {
  67. getEffect = GetCardEffect;
  68. activateClass.EffectSourceCard.Owner.UntilEachTurnEndEffects.Add(getEffect);
  69. }
  70. }
  71. yield return ContinuousController.instance.StartCoroutine(playCard.PlayCard());
  72. if (getEffect != null)
  73. {
  74. activateClass.EffectSourceCard.Owner.UntilEachTurnEndEffects.Remove(getEffect);
  75. }
  76. ICardEffect GetCardEffect(EffectTiming timing)
  77. {
  78. if (timing == EffectTiming.None)
  79. {
  80. return CardEffectFactory.PlaceToSecurityEffect(activateClass.EffectSourceCard, toTop: true);
  81. }
  82. return null;
  83. }
  84. }
  85. #endregion
  86. #region Play Delay Option cards as new permanents
  87. public static IEnumerator PlaceDelayOptionCards(CardSource card, ICardEffect cardEffect, SelectCardEffect.Root root = SelectCardEffect.Root.Execution)
  88. {
  89. if (CanPlayAsNewPermanent(cardSource: card, payCost: false, cardEffect: cardEffect, isPlayOption: true))
  90. {
  91. PlayPermanentClass playPermanent = new PlayPermanentClass(
  92. cardSources: new List<CardSource>() { card },
  93. hashtable: CardEffectHashtable(cardEffect),
  94. targetPermanent: null,
  95. isTapped: false,
  96. root: root,
  97. ActivateETB: true);
  98. playPermanent.SetISPlayOption();
  99. yield return ContinuousController.instance.StartCoroutine(playPermanent.PlayPermanent());
  100. if (IsExistOnBattleArea(card))
  101. {
  102. card.PermanentOfThisCard().IsPlayedOptionPermanent = true;
  103. }
  104. }
  105. }
  106. #endregion
  107. #region Play 1 Token
  108. public static IEnumerator PlayToken(CEntity_Base tokenData, ICardEffect activateClass, bool isOwnerPermanent, bool isTapped, int quantity = 1)
  109. {
  110. if (activateClass == null) yield break;
  111. if (activateClass.EffectSourceCard == null) yield break;
  112. if (tokenData == null) yield break;
  113. CardSource card = activateClass.EffectSourceCard;
  114. Player player = isOwnerPermanent ? card.Owner : card.Owner.Enemy;
  115. if (card.Owner.fieldCardFrames.Count((frame) => frame.IsEmptyFrame() && frame.IsBattleAreaFrame()) >= quantity)
  116. {
  117. List<CardSource> playCards = new List<CardSource>();
  118. for (int i = 0; i < quantity; i++)
  119. {
  120. CardSource tokenCard = CardObjectController.CreateCardSource(
  121. player.PlayerID,
  122. tokenData,
  123. true);
  124. playCards.Add(tokenCard);
  125. }
  126. if (CanPlayAsNewPermanent(cardSource: playCards[0], payCost: false, cardEffect: activateClass))
  127. {
  128. yield return ContinuousController.instance.StartCoroutine(new PlayCardClass(
  129. cardSources: playCards,
  130. hashtable: CardEffectHashtable(activateClass),
  131. payCost: false,
  132. targetPermanent: null,
  133. isTapped: isTapped,
  134. root: SelectCardEffect.Root.None,
  135. activateETB: true).PlayCard());
  136. }
  137. }
  138. }
  139. #endregion
  140. #region Play 1 [Diaboromon] Token
  141. public static IEnumerator PlayDiaboromonToken(ICardEffect activateClass, int quantity = 1)
  142. {
  143. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  144. tokenData: ContinuousController.instance.DiaboromonToken,
  145. activateClass: activateClass,
  146. isOwnerPermanent: true,
  147. isTapped: false,
  148. quantity: quantity
  149. ));
  150. }
  151. #endregion
  152. #region Play 1 [Amon of Crimson Flame] Token
  153. public static IEnumerator PlayAmonToken(ICardEffect activateClass)
  154. {
  155. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  156. tokenData: ContinuousController.instance.AmonToken,
  157. activateClass: activateClass,
  158. isOwnerPermanent: true,
  159. isTapped: false
  160. ));
  161. }
  162. #endregion
  163. #region Play 1 [Umon of Blue Thunder] Token
  164. public static IEnumerator PlayUmonToken(ICardEffect activateClass)
  165. {
  166. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  167. tokenData: ContinuousController.instance.UmonToken,
  168. activateClass: activateClass,
  169. isOwnerPermanent: true,
  170. isTapped: false
  171. ));
  172. }
  173. #endregion
  174. #region Play 1 [Fujitsumon] Token
  175. public static IEnumerator PlayFujitsumonToken(ICardEffect activateClass, bool isOwnerPermanent)
  176. {
  177. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  178. tokenData: ContinuousController.instance.FujitsumonToken,
  179. activateClass: activateClass,
  180. isOwnerPermanent: isOwnerPermanent,
  181. isTapped: true
  182. ));
  183. }
  184. #endregion
  185. #region Play 1 [Gyuukimon] Token
  186. public static IEnumerator PlayGyuukimonToken(ICardEffect activateClass)
  187. {
  188. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  189. tokenData: ContinuousController.instance.GyuukimonToken,
  190. activateClass: activateClass,
  191. isOwnerPermanent: true,
  192. isTapped: false
  193. ));
  194. }
  195. #endregion
  196. #region Play 1 [KoHagurumon] Token
  197. public static IEnumerator PlayKoHagurumonToken(ICardEffect activateClass)
  198. {
  199. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  200. tokenData: ContinuousController.instance.KoHagurumonToken,
  201. activateClass: activateClass,
  202. isOwnerPermanent: true,
  203. isTapped: false
  204. ));
  205. }
  206. #endregion
  207. #region Play 1 [Familiar] Token
  208. public static IEnumerator PlayFamiliarToken(ICardEffect activateClass, int quantity = 1)
  209. {
  210. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  211. tokenData: ContinuousController.instance.FamiliarToken,
  212. activateClass: activateClass,
  213. isOwnerPermanent: true,
  214. isTapped: false,
  215. quantity: quantity
  216. ));
  217. }
  218. #endregion
  219. #region Play 1 Self Deleting [Familiar] Token
  220. public static IEnumerator PlaySelfDeleteFamiliarToken(ICardEffect activateClass, int quantity = 1)
  221. {
  222. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  223. tokenData: ContinuousController.instance.SelfDeleteFamiliarToken,
  224. activateClass: activateClass,
  225. isOwnerPermanent: true,
  226. isTapped: false,
  227. quantity: quantity
  228. ));
  229. }
  230. #endregion
  231. #region Play 1 [Volée & Zerdrücken] Token
  232. public static IEnumerator PlayVoleeZerdrucken(ICardEffect activateClass)
  233. {
  234. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  235. tokenData: ContinuousController.instance.VoleeZerdruckenToken,
  236. activateClass: activateClass,
  237. isOwnerPermanent: true,
  238. isTapped: false
  239. ));
  240. }
  241. #endregion
  242. #region Play 1 [Uka-no-Mitama] Token
  243. public static IEnumerator PlayUkaNoMitama(ICardEffect activateClass)
  244. {
  245. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  246. tokenData: ContinuousController.instance.UkaNoMitamaToken,
  247. activateClass: activateClass,
  248. isOwnerPermanent: true,
  249. isTapped: false
  250. ));
  251. }
  252. #endregion
  253. #region Play 1 [WarGrowlmon] Token
  254. public static IEnumerator PlayWarGrowlmonToken(ICardEffect activateClass)
  255. {
  256. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  257. tokenData: ContinuousController.instance.WarGrowlmonToken,
  258. activateClass: activateClass,
  259. isOwnerPermanent: true,
  260. isTapped: false
  261. ));
  262. }
  263. #endregion
  264. #region Play 1 [Taomon] Token
  265. public static IEnumerator PlayTaomonToken(ICardEffect activateClass)
  266. {
  267. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  268. tokenData: ContinuousController.instance.TaomonToken,
  269. activateClass: activateClass,
  270. isOwnerPermanent: true,
  271. isTapped: false
  272. ));
  273. }
  274. #endregion
  275. #region Play 1 [Rapidmon] Token
  276. public static IEnumerator PlayRapidmonToken(ICardEffect activateClass)
  277. {
  278. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  279. tokenData: ContinuousController.instance.RapidmonToken,
  280. activateClass: activateClass,
  281. isOwnerPermanent: true,
  282. isTapped: false
  283. ));
  284. }
  285. #endregion
  286. #region Play 1 [Pipe-Fox] Token
  287. public static IEnumerator PlayPipeFox(ICardEffect activateClass)
  288. {
  289. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  290. tokenData: ContinuousController.instance.PipeFoxToken,
  291. activateClass: activateClass,
  292. isOwnerPermanent: true,
  293. isTapped: false
  294. ));
  295. }
  296. #endregion
  297. #region Play 1 [AthoRenePor] Token
  298. public static IEnumerator PlayAthoRenePorToken(ICardEffect activateClass)
  299. {
  300. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  301. tokenData: ContinuousController.instance.AthoRenePorToken,
  302. activateClass: activateClass,
  303. isOwnerPermanent: true,
  304. isTapped: false
  305. ));
  306. }
  307. #endregion
  308. #region Play 1 [Hinukamuy] Token
  309. public static IEnumerator PlayHinukamuyToken(ICardEffect activateClass)
  310. {
  311. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  312. tokenData: ContinuousController.instance.HinukamuyToken,
  313. activateClass: activateClass,
  314. isOwnerPermanent: true,
  315. isTapped: false
  316. ));
  317. }
  318. #endregion
  319. #region Play [Petrification] Token(s)
  320. public static IEnumerator PlayPetrificationToken(ICardEffect activateClass, int quantity = 1)
  321. {
  322. yield return ContinuousController.instance.StartCoroutine(PlayToken(
  323. tokenData: ContinuousController.instance.PetrificationToken,
  324. activateClass: activateClass,
  325. isOwnerPermanent: false,
  326. isTapped: false,
  327. quantity
  328. ));
  329. }
  330. #endregion
  331. #region Security effect of "add this card to hand"
  332. public static IEnumerator AddThisCardToHand(CardSource card1, ICardEffect activateClass)
  333. {
  334. yield return new WaitForSeconds(0.5f);
  335. yield return ContinuousController.instance.StartCoroutine(card1.Owner.brainStormObject.CloseBrainstrorm(card1));
  336. yield return ContinuousController.instance.StartCoroutine(CardObjectController.AddHandCards(new List<CardSource>() { card1 }, false, activateClass));
  337. }
  338. #endregion
  339. #region Suspend target permanents, and the effect determines whether the permanent has been suspended or not
  340. public static IEnumerator SuspendPeremanentAndProcessAccordingToResult(List<Permanent> targetPermanents, ICardEffect activateClass, Func<List<Permanent>, IEnumerator> successProcess, Func<IEnumerator> failureProcess)
  341. {
  342. SuspendPermanentsClass suspendPermanentsClass = new SuspendPermanentsClass(targetPermanents, CardEffectHashtable(activateClass));
  343. yield return ContinuousController.instance.StartCoroutine(suspendPermanentsClass.Tap());
  344. if (targetPermanents.Some((permanent) => suspendPermanentsClass.IsSuspended(permanent)))
  345. {
  346. if (successProcess != null)
  347. {
  348. yield return ContinuousController.instance.StartCoroutine(successProcess(suspendPermanentsClass.SuspendedPermanents));
  349. }
  350. }
  351. else
  352. {
  353. if (failureProcess != null)
  354. {
  355. yield return ContinuousController.instance.StartCoroutine(failureProcess());
  356. }
  357. }
  358. }
  359. #endregion
  360. #region Delete target permanents, and the effect determines whether the permanent has been deleted or not
  361. public static IEnumerator DeletePeremanentAndProcessAccordingToResult(List<Permanent> targetPermanents, ICardEffect activateClass, Func<List<Permanent>, IEnumerator> successProcess, Func<IEnumerator> failureProcess)
  362. {
  363. DestroyPermanentsClass destroyPermanentsClass = new DestroyPermanentsClass(targetPermanents, CardEffectHashtable(activateClass));
  364. yield return ContinuousController.instance.StartCoroutine(destroyPermanentsClass.Destroy());
  365. if (targetPermanents.Some((permanent) => destroyPermanentsClass.IsDestroyed(permanent)))
  366. {
  367. if (successProcess != null)
  368. {
  369. yield return ContinuousController.instance.StartCoroutine(successProcess(destroyPermanentsClass.DestroyedPermanents));
  370. }
  371. }
  372. else
  373. {
  374. if (failureProcess != null)
  375. {
  376. yield return ContinuousController.instance.StartCoroutine(failureProcess());
  377. }
  378. }
  379. }
  380. #endregion
  381. #region Bounce target 1 permanent, and the effect determines whether the permanent has been bounced or not
  382. public static IEnumerator BouncePeremanentAndProcessAccordingToResult(List<Permanent> targetPermanents, ICardEffect activateClass, IEnumerator successProcess, IEnumerator failureProcess)
  383. {
  384. HandBounceClaass bouncePermanentClass = new HandBounceClaass(targetPermanents, CardEffectHashtable(activateClass));
  385. yield return ContinuousController.instance.StartCoroutine(bouncePermanentClass.Bounce());
  386. if (targetPermanents.Some((permanent) => bouncePermanentClass.IsBounced(permanent)))
  387. {
  388. if (successProcess != null)
  389. {
  390. yield return ContinuousController.instance.StartCoroutine(successProcess);
  391. }
  392. }
  393. else
  394. {
  395. if (failureProcess != null)
  396. {
  397. yield return ContinuousController.instance.StartCoroutine(failureProcess);
  398. }
  399. }
  400. }
  401. #endregion
  402. #region Deck Bounce target 1 permanent, and the effect determines whether the permanent has been bounced or not
  403. public static IEnumerator DeckBouncePeremanentAndProcessAccordingToResult(List<Permanent> targetPermanents, ICardEffect activateClass, IEnumerator successProcess, IEnumerator failureProcess)
  404. {
  405. DeckBottomBounceClass deckBounceClass = new DeckBottomBounceClass(targetPermanents, CardEffectHashtable(activateClass));
  406. yield return ContinuousController.instance.StartCoroutine(deckBounceClass.DeckBounce());
  407. if (targetPermanents.Some((permanent) => deckBounceClass.IsDeckBounced(permanent)))
  408. {
  409. if (successProcess != null)
  410. {
  411. yield return ContinuousController.instance.StartCoroutine(successProcess);
  412. }
  413. }
  414. else
  415. {
  416. if (failureProcess != null)
  417. {
  418. yield return ContinuousController.instance.StartCoroutine(failureProcess);
  419. }
  420. }
  421. }
  422. #endregion
  423. #region Trash target digivolution cards, and the effect determines whether the digivolution cards were trashed or not
  424. public static IEnumerator TrashDigivolutionCardsAndProcessAccordingToResult(Permanent targetPermanent, List<CardSource> targetDigivolutionCards, ICardEffect activateClass, Func<List<CardSource>, IEnumerator> successProcess, Func<IEnumerator> failureProcess)
  425. {
  426. ITrashDigivolutionCards trashDigivolutionCards = new ITrashDigivolutionCards(targetPermanent, targetDigivolutionCards, activateClass);
  427. yield return ContinuousController.instance.StartCoroutine(trashDigivolutionCards.TrashDigivolutionCards());
  428. if (targetDigivolutionCards.Some((sourceCard) => trashDigivolutionCards.IsTrashed(sourceCard)))
  429. {
  430. if (successProcess != null)
  431. {
  432. yield return ContinuousController.instance.StartCoroutine(successProcess(trashDigivolutionCards.TrashedCards));
  433. }
  434. }
  435. else
  436. {
  437. if (failureProcess != null)
  438. {
  439. yield return ContinuousController.instance.StartCoroutine(failureProcess());
  440. }
  441. }
  442. }
  443. #endregion
  444. #region Trash target link cards, and the effect determines whether the link cards were trashed or not
  445. public static IEnumerator TrashLinkCardsAndProcessAccordingToResult(Permanent targetPermanent, List<CardSource> targetLinkCards, ICardEffect activateClass, Func<List<CardSource>, IEnumerator> successProcess, Func<IEnumerator> failureProcess)
  446. {
  447. ITrashLinkCards trashLinkCards = new ITrashLinkCards(targetPermanent, targetLinkCards, activateClass);
  448. yield return ContinuousController.instance.StartCoroutine(trashLinkCards.TrashLinkCards());
  449. if (targetLinkCards.Some((sourceCard) => trashLinkCards.IsTrashed(sourceCard)))
  450. {
  451. if (successProcess != null)
  452. {
  453. yield return ContinuousController.instance.StartCoroutine(successProcess(trashLinkCards.TrashedLinkCards));
  454. }
  455. }
  456. else
  457. {
  458. if (failureProcess != null)
  459. {
  460. yield return ContinuousController.instance.StartCoroutine(failureProcess());
  461. }
  462. }
  463. }
  464. #endregion
  465. #region Trash Security cards and the effect determines whether the security were trashed or not
  466. public static IEnumerator TrashSecurityAndProcessAccordingToResult(Player player, int trashAmount, ICardEffect activateClass, bool fromTop, Func<List<CardSource>, IEnumerator> successProcess, Func<IEnumerator> failureProcess)
  467. {
  468. IDestroySecurity destroySecurity = new IDestroySecurity(player, trashAmount, activateClass, fromTop);
  469. yield return ContinuousController.instance.StartCoroutine(destroySecurity.DestroySecurity());
  470. if (destroySecurity.DestroyedSecurity.Any())
  471. {
  472. if (successProcess != null)
  473. {
  474. yield return ContinuousController.instance.StartCoroutine(successProcess(destroySecurity.DestroyedSecurity));
  475. }
  476. }
  477. else
  478. {
  479. if (failureProcess != null)
  480. {
  481. yield return ContinuousController.instance.StartCoroutine(failureProcess());
  482. }
  483. }
  484. }
  485. #endregion
  486. #region Place in security with callbacks for success or failure
  487. public static IEnumerator PlacePermanentInSecurityAndProcessAccordingToResult(Permanent targetPermanent, ICardEffect activateClass, bool toTop, Func<CardSource, IEnumerator> successProcess, Func<IEnumerator> failureProcess = null, bool isFaceUp = false)
  488. {
  489. IPutSecurityPermanent putSecurityPermanent = new IPutSecurityPermanent(targetPermanent, CardEffectCommons.CardEffectHashtable(activateClass), toTop, isFaceUp);
  490. CardSource topCard = targetPermanent.TopCard;
  491. if (activateClass.EffectSourceCard != null
  492. && activateClass.EffectSourceCard.Owner.CanAddSecurity(activateClass))
  493. {
  494. yield return ContinuousController.instance.StartCoroutine(putSecurityPermanent.PutSecurity());
  495. }
  496. if (putSecurityPermanent.IsPlacedSecurity)
  497. {
  498. if (successProcess != null)
  499. {
  500. yield return ContinuousController.instance.StartCoroutine(successProcess(topCard));
  501. }
  502. }
  503. else
  504. {
  505. if (failureProcess != null)
  506. {
  507. yield return ContinuousController.instance.StartCoroutine(failureProcess());
  508. }
  509. }
  510. }
  511. #endregion
  512. #region Trash digivolution cards from top or bottom
  513. public static IEnumerator TrashDigivolutionCardsFromTopOrBottom(Permanent targetPermanent, int trashCount, bool isFromTop, ICardEffect activateClass, Func<CardSource, bool> cardCondition = null)
  514. {
  515. if (activateClass == null) yield break;
  516. if (targetPermanent == null) yield break;
  517. if (targetPermanent.TopCard == null) yield break;
  518. if (targetPermanent.DigivolutionCards.Count((cardSource) => !cardSource.CanNotTrashFromDigivolutionCards(activateClass)) == 0) yield break;
  519. if (targetPermanent.TopCard.CanNotBeAffected(activateClass)) yield break;
  520. if (trashCount <= 0) yield break;
  521. List<CardSource> trashTargetCards = new List<CardSource>();
  522. for (int i = 0; i < targetPermanent.DigivolutionCards.Count; i++)
  523. {
  524. if (trashTargetCards.Count >= trashCount)
  525. break;
  526. int index = isFromTop ? i : targetPermanent.DigivolutionCards.Count - 1 - i;
  527. CardSource trashTargetCard = targetPermanent.DigivolutionCards[index];
  528. bool trashCard = true;
  529. if (cardCondition != null)
  530. trashCard = cardCondition(trashTargetCard);
  531. if (trashCard)
  532. trashTargetCards.Add(trashTargetCard);
  533. }
  534. yield return ContinuousController.instance.StartCoroutine(new ITrashDigivolutionCards(targetPermanent, trashTargetCards, activateClass).TrashDigivolutionCards());
  535. }
  536. #endregion
  537. #region this Option card's Main effect
  538. public static ActivateClass OptionMainEffect(CardSource card) => card.EffectList(EffectTiming.OptionSkill).Find(cardEffect => cardEffect != null && cardEffect is ActivateClass && cardEffect.EffectDiscription.Contains("[Main]")) as ActivateClass;
  539. #endregion
  540. #region this Option card's Security effect
  541. public static ActivateClass OptionSecurityEffect(CardSource card) => card.EffectList(EffectTiming.SecuritySkill).Find(cardEffect => cardEffect != null && cardEffect is ActivateClass && cardEffect.EffectDiscription.Contains("[Security]")) as ActivateClass;
  542. #endregion
  543. #region Add Option's Security effect that "Activate this card's Main effect" to cardEffects
  544. public static void AddActivateMainOptionSecurityEffect(CardSource card, ref List<ICardEffect> cardEffects, string effectName, string effectDiscription = "", Func<ICardEffect, IEnumerator> afterMainEffect = null)
  545. {
  546. if (OptionMainEffect(card) == null) return;
  547. cardEffects.Add(CardEffectFactory.ActivateMainOptionSecurityEffect(card, effectName, effectDiscription, afterMainEffect));
  548. }
  549. #endregion
  550. #region Activate Main of Dual Cards Option Side
  551. public static IEnumerator ActivateMainOfOptionSide(CardSource card, ICardEffect activateClass, Func<ICardEffect, IEnumerator> afterMainEffect = null, bool asEffectOfThisDigimon = false)
  552. {
  553. ActivateClass mainActivateClass = OptionMainEffect(card);
  554. #region Set as option effect unless explicitly effect of the digimon
  555. mainActivateClass.SetIsDigimonEffect(asEffectOfThisDigimon);
  556. mainActivateClass.SetIsTamerEffect(false);
  557. #endregion
  558. if (mainActivateClass != null)
  559. {
  560. yield return ContinuousController.instance.StartCoroutine(mainActivateClass.Activate(CardEffectCommons.OptionMainCheckHashtable(card)));
  561. }
  562. if (afterMainEffect != null)
  563. {
  564. yield return ContinuousController.instance.StartCoroutine(afterMainEffect(activateClass));
  565. }
  566. }
  567. #endregion
  568. #region Target permanent Digivolves into Digimon card from hand or trash
  569. public static IEnumerator DigivolveIntoHandOrTrashCard(
  570. Permanent targetPermanent,
  571. Func<CardSource, bool> cardCondition,
  572. bool payCost,
  573. (int reduceCost, Func<CardSource, bool> reduceCostCardCondition)? reduceCostTuple,
  574. (int fixedCost, Func<CardSource, bool> fixedCostCardCondition)? fixedCostTuple,
  575. int ignoreDigivolutionRequirementFixedCost,
  576. bool isHand,
  577. ICardEffect activateClass,
  578. IEnumerator successProcess,
  579. //bool ignoreLevel = false,
  580. bool ignoreSelection = false,
  581. IgnoreRequirement ignoreRequirements = IgnoreRequirement.None,
  582. IEnumerator failedProcess = null,
  583. bool isOptional = true)
  584. {
  585. if (targetPermanent == null) yield break;
  586. if (targetPermanent.TopCard == null) yield break;
  587. if (activateClass == null) yield break;
  588. if (activateClass.EffectSourceCard == null) yield break;
  589. Player owner = targetPermanent.TopCard.Owner;
  590. SelectCardEffect.Root root = isHand ? SelectCardEffect.Root.Hand : SelectCardEffect.Root.Trash;
  591. bool ignoreDigivolutionRequirement = !ignoreRequirements.Equals(IgnoreRequirement.None) || ignoreDigivolutionRequirementFixedCost >= 0;// ignoreDigivolutionRequirementFixedCost >= 0 || ignoreRequirements;
  592. int fixedCost = -1;
  593. bool successful = false;
  594. if (fixedCostTuple != null)
  595. {
  596. fixedCost = fixedCostTuple.Value.fixedCost;
  597. }
  598. if (ignoreDigivolutionRequirement)
  599. {
  600. fixedCost = ignoreDigivolutionRequirementFixedCost;
  601. }
  602. bool CanSelectCardCondition(CardSource cardSource)
  603. {
  604. if (cardSource.IsDigimon)
  605. {
  606. if (cardCondition == null || cardCondition(cardSource))
  607. {
  608. if (!cardSource.CanNotEvolve(targetPermanent))
  609. {
  610. bool isBreeding = cardSource.Owner.GetBreedingAreaPermanents().Contains(targetPermanent);
  611. if (cardSource.CanPlayCardTargetFrame(
  612. frame: targetPermanent.PermanentFrame,
  613. PayCost: payCost,
  614. cardEffect: activateClass,
  615. root: root,
  616. fixedCost: fixedCost,
  617. ignore: ignoreRequirements,
  618. isBreedingArea: isBreeding))
  619. {
  620. return true;
  621. }
  622. }
  623. }
  624. }
  625. return false;
  626. }
  627. #region reduce cost
  628. Func<EffectTiming, ICardEffect> getChangeCostEffect = null;
  629. if (reduceCostTuple != null)
  630. {
  631. bool PermanentCondition(Permanent permanent)
  632. {
  633. return permanent == targetPermanent;
  634. }
  635. bool CardCondition(CardSource cardSource)
  636. {
  637. if (cardSource != null)
  638. {
  639. if (cardSource.Owner == owner)
  640. {
  641. if (reduceCostTuple.Value.reduceCostCardCondition == null || reduceCostTuple.Value.reduceCostCardCondition(cardSource))
  642. {
  643. return true;
  644. }
  645. }
  646. }
  647. return false;
  648. }
  649. getChangeCostEffect = ChangeDigivolutionCostPlayerEffect(
  650. permanentCondition: PermanentCondition,
  651. cardCondition: CardCondition,
  652. rootCondition: null,
  653. changeValue: -reduceCostTuple.Value.reduceCost,
  654. activateClass: activateClass,
  655. setFixedCost: false);
  656. if (getChangeCostEffect != null)
  657. {
  658. AddEffectToPlayer(
  659. effectDuration: EffectDuration.UntilCalculateFixedCost,
  660. card: targetPermanent.TopCard,
  661. cardEffect: null,
  662. timing: EffectTiming.None,
  663. getCardEffect: getChangeCostEffect);
  664. }
  665. }
  666. #endregion
  667. #region set fixed cost
  668. Func<EffectTiming, ICardEffect> getFixedCostEffect = null;
  669. if (fixedCostTuple != null)
  670. {
  671. bool PermanentCondition(Permanent permanent)
  672. {
  673. return permanent == targetPermanent;
  674. }
  675. bool CardCondition(CardSource cardSource)
  676. {
  677. if (cardSource != null)
  678. {
  679. if (cardSource.Owner == owner)
  680. {
  681. if (fixedCostTuple.Value.fixedCostCardCondition == null || fixedCostTuple.Value.fixedCostCardCondition(cardSource))
  682. {
  683. return true;
  684. }
  685. }
  686. }
  687. return false;
  688. }
  689. getFixedCostEffect = ChangeDigivolutionCostPlayerEffect(
  690. permanentCondition: PermanentCondition,
  691. cardCondition: CardCondition,
  692. rootCondition: null,
  693. changeValue: fixedCost,
  694. activateClass: activateClass,
  695. setFixedCost: true);
  696. if (getChangeCostEffect != null)
  697. {
  698. AddEffectToPlayer(
  699. effectDuration: EffectDuration.UntilCalculateFixedCost,
  700. card: targetPermanent.TopCard,
  701. cardEffect: null,
  702. timing: EffectTiming.None,
  703. getCardEffect: getFixedCostEffect);
  704. }
  705. }
  706. #endregion
  707. #region ignore digivolution requirement
  708. Func<EffectTiming, ICardEffect> getIgnoreDigivolutionRequirementEffect = null;
  709. if (ignoreDigivolutionRequirement)
  710. {
  711. bool PermanentCondition(Permanent permanent)
  712. {
  713. return permanent == targetPermanent;
  714. }
  715. bool CardCondition(CardSource cardSource)
  716. {
  717. if (cardSource == null)
  718. {
  719. return false;
  720. }
  721. if (cardSource.Owner != owner)
  722. {
  723. return false;
  724. }
  725. if (cardCondition == null || cardCondition(cardSource))
  726. {
  727. return true;
  728. }
  729. return false;
  730. }
  731. getIgnoreDigivolutionRequirementEffect = GainIgnoreDigivolutionRequirementPlayerEffect(
  732. permanentCondition: PermanentCondition,
  733. cardCondition: CardCondition,
  734. ignoreDigivolutionRequirement: ignoreDigivolutionRequirement,
  735. digivolutionCost: fixedCost,
  736. activateClass: activateClass);
  737. if (getIgnoreDigivolutionRequirementEffect != null)
  738. {
  739. AddEffectToPlayer(
  740. effectDuration: EffectDuration.UntilCalculateFixedCost,
  741. card: targetPermanent.TopCard,
  742. cardEffect: null,
  743. timing: EffectTiming.None,
  744. getCardEffect: getIgnoreDigivolutionRequirementEffect);
  745. }
  746. }
  747. #endregion
  748. List<CardSource> selectedCards = new List<CardSource>();
  749. IEnumerator SelectCardCoroutine(CardSource cardSource)
  750. {
  751. selectedCards.Add(cardSource);
  752. yield return null;
  753. }
  754. if (isHand)
  755. {
  756. if (owner.HandCards.Count(CanSelectCardCondition) >= 1)
  757. {
  758. int maxCount = Mathf.Min(1, owner.HandCards.Count(CanSelectCardCondition));
  759. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  760. selectHandEffect.SetUp(
  761. selectPlayer: owner,
  762. canTargetCondition: CanSelectCardCondition,
  763. canTargetCondition_ByPreSelecetedList: null,
  764. canEndSelectCondition: null,
  765. maxCount: maxCount,
  766. canNoSelect: isOptional,
  767. canEndNotMax: false,
  768. isShowOpponent: true,
  769. selectCardCoroutine: SelectCardCoroutine,
  770. afterSelectCardCoroutine: null,
  771. mode: SelectHandEffect.Mode.Custom,
  772. cardEffect: activateClass);
  773. selectHandEffect.SetUpCustomMessage("Select 1 card to digivolve.", "The opponent is selecting 1 card to digivolve.");
  774. selectHandEffect.SetUpCustomMessage_ShowCard("Selected Card");
  775. yield return ContinuousController.instance.StartCoroutine(selectHandEffect.Activate());
  776. }
  777. }
  778. else
  779. {
  780. if (HasMatchConditionOwnersCardInTrash(targetPermanent.TopCard, CanSelectCardCondition) && !ignoreSelection)
  781. {
  782. int maxCount = 1;
  783. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  784. selectCardEffect.SetUp(
  785. canTargetCondition: CanSelectCardCondition,
  786. canTargetCondition_ByPreSelecetedList: null,
  787. canEndSelectCondition: null,
  788. canNoSelect: () => isOptional,
  789. selectCardCoroutine: SelectCardCoroutine,
  790. afterSelectCardCoroutine: null,
  791. message: "Select 1 card to digivolve.",
  792. maxCount: maxCount,
  793. canEndNotMax: false,
  794. isShowOpponent: true,
  795. mode: SelectCardEffect.Mode.Custom,
  796. root: SelectCardEffect.Root.Trash,
  797. customRootCardList: null,
  798. canLookReverseCard: true,
  799. selectPlayer: owner,
  800. cardEffect: activateClass);
  801. selectCardEffect.SetUpCustomMessage("Select 1 card to digivolve.", "The opponent is selecting 1 card to digivolve.");
  802. selectCardEffect.SetUpCustomMessage_ShowCard("Selected Card");
  803. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  804. }
  805. else
  806. {
  807. if (ignoreSelection)
  808. selectedCards.Add(activateClass.EffectSourceCard);
  809. }
  810. }
  811. PlayCardClass playCardClass = new PlayCardClass(
  812. cardSources: selectedCards,
  813. hashtable: CardEffectHashtable(activateClass),
  814. payCost: payCost,
  815. targetPermanent: targetPermanent,
  816. isTapped: false,
  817. root: root,
  818. activateETB: true);
  819. //if (ignoreRequirements.Equals(IgnoreRequirement.All) || ignoreRequirements.Equals(IgnoreRequirement.Level))
  820. // playCardClass.SetIgnoreLevel();
  821. playCardClass.SetIgnoreRequirements(ignoreRequirements);
  822. //!ignoreRequirements
  823. if (fixedCost >= 0)
  824. playCardClass.SetFixedCost(fixedCost);
  825. yield return ContinuousController.instance.StartCoroutine(playCardClass.PlayCard());
  826. #region release effect
  827. if (getChangeCostEffect != null) owner.UntilCalculateFixedCostEffect.Remove(getChangeCostEffect);
  828. #endregion
  829. #region release effect
  830. if (getFixedCostEffect != null) owner.UntilCalculateFixedCostEffect.Remove(getFixedCostEffect);
  831. #endregion
  832. #region release effect
  833. if (getIgnoreDigivolutionRequirementEffect != null) owner.UntilCalculateFixedCostEffect.Remove(getIgnoreDigivolutionRequirementEffect);
  834. #endregion
  835. if (selectedCards.Count >= 1)
  836. {
  837. if (IsDigivolvedByTheEffect(targetPermanent, selectedCards[0], activateClass))
  838. {
  839. successful = true;
  840. }
  841. }
  842. if (successful)
  843. {
  844. if (successProcess != null)
  845. yield return ContinuousController.instance.StartCoroutine(successProcess);
  846. }
  847. else
  848. {
  849. if (failedProcess != null)
  850. yield return ContinuousController.instance.StartCoroutine(failedProcess);
  851. }
  852. }
  853. #endregion
  854. #region Target permanent Digivolves into Digimon card execution area
  855. public static IEnumerator DigivolveIntoExcecutingAreaCard(
  856. Permanent targetPermanent,
  857. Func<CardSource, bool> cardCondition,
  858. bool payCost,
  859. (int reduceCost, Func<CardSource, bool> reduceCostCardCondition)? reduceCostTuple,
  860. (int fixedCost, Func<CardSource, bool> fixedCostCardCondition)? fixedCostTuple,
  861. int ignoreDigivolutionRequirementFixedCost,
  862. ICardEffect activateClass,
  863. IEnumerator successProcess,
  864. bool ignoreSelection = false,
  865. IgnoreRequirement ignoreRequirements = IgnoreRequirement.None)
  866. {
  867. if (targetPermanent == null) yield break;
  868. if (targetPermanent.TopCard == null) yield break;
  869. if (activateClass == null) yield break;
  870. if (activateClass.EffectSourceCard == null) yield break;
  871. Player owner = targetPermanent.TopCard.Owner;
  872. SelectCardEffect.Root root = SelectCardEffect.Root.Execution;
  873. bool ignoreDigivolutionRequirement = !ignoreRequirements.Equals(IgnoreRequirement.None) || ignoreDigivolutionRequirementFixedCost >= 0;// ignoreDigivolutionRequirementFixedCost >= 0 || ignoreRequirements;
  874. int fixedCost = -1;
  875. if (fixedCostTuple != null)
  876. {
  877. fixedCost = fixedCostTuple.Value.fixedCost;
  878. }
  879. if (ignoreDigivolutionRequirement)
  880. {
  881. fixedCost = ignoreDigivolutionRequirementFixedCost;
  882. }
  883. bool CanSelectCardCondition(CardSource cardSource)
  884. {
  885. if (cardSource.IsDigimon)
  886. {
  887. if (cardCondition == null || cardCondition(cardSource))
  888. {
  889. if (!cardSource.CanNotEvolve(targetPermanent))
  890. {
  891. if (cardSource.CanPlayCardTargetFrame(
  892. frame: targetPermanent.PermanentFrame,
  893. PayCost: payCost,
  894. cardEffect: activateClass,
  895. root: root,
  896. fixedCost: fixedCost,
  897. ignore: ignoreRequirements))
  898. {
  899. return true;
  900. }
  901. }
  902. }
  903. }
  904. return false;
  905. }
  906. #region reduce cost
  907. Func<EffectTiming, ICardEffect> getChangeCostEffect = null;
  908. if (reduceCostTuple != null)
  909. {
  910. bool PermanentCondition(Permanent permanent)
  911. {
  912. return permanent == targetPermanent;
  913. }
  914. bool CardCondition(CardSource cardSource)
  915. {
  916. if (cardSource != null)
  917. {
  918. if (cardSource.Owner == owner)
  919. {
  920. if (reduceCostTuple.Value.reduceCostCardCondition == null || reduceCostTuple.Value.reduceCostCardCondition(cardSource))
  921. {
  922. return true;
  923. }
  924. }
  925. }
  926. return false;
  927. }
  928. getChangeCostEffect = ChangeDigivolutionCostPlayerEffect(
  929. permanentCondition: PermanentCondition,
  930. cardCondition: CardCondition,
  931. rootCondition: null,
  932. changeValue: -reduceCostTuple.Value.reduceCost,
  933. activateClass: activateClass,
  934. setFixedCost: false);
  935. if (getChangeCostEffect != null)
  936. {
  937. AddEffectToPlayer(
  938. effectDuration: EffectDuration.UntilCalculateFixedCost,
  939. card: targetPermanent.TopCard,
  940. cardEffect: null,
  941. timing: EffectTiming.None,
  942. getCardEffect: getChangeCostEffect);
  943. }
  944. }
  945. #endregion
  946. #region set fixed cost
  947. Func<EffectTiming, ICardEffect> getFixedCostEffect = null;
  948. if (fixedCostTuple != null)
  949. {
  950. bool PermanentCondition(Permanent permanent)
  951. {
  952. return permanent == targetPermanent;
  953. }
  954. bool CardCondition(CardSource cardSource)
  955. {
  956. if (cardSource != null)
  957. {
  958. if (cardSource.Owner == owner)
  959. {
  960. if (fixedCostTuple.Value.fixedCostCardCondition == null || fixedCostTuple.Value.fixedCostCardCondition(cardSource))
  961. {
  962. return true;
  963. }
  964. }
  965. }
  966. return false;
  967. }
  968. getFixedCostEffect = ChangeDigivolutionCostPlayerEffect(
  969. permanentCondition: PermanentCondition,
  970. cardCondition: CardCondition,
  971. rootCondition: null,
  972. changeValue: fixedCost,
  973. activateClass: activateClass,
  974. setFixedCost: true);
  975. if (getChangeCostEffect != null)
  976. {
  977. AddEffectToPlayer(
  978. effectDuration: EffectDuration.UntilCalculateFixedCost,
  979. card: targetPermanent.TopCard,
  980. cardEffect: null,
  981. timing: EffectTiming.None,
  982. getCardEffect: getFixedCostEffect);
  983. }
  984. }
  985. #endregion
  986. #region ignore digivolution requirement
  987. Func<EffectTiming, ICardEffect> getIgnoreDigivolutionRequirementEffect = null;
  988. if (ignoreDigivolutionRequirement)
  989. {
  990. bool PermanentCondition(Permanent permanent)
  991. {
  992. return permanent == targetPermanent;
  993. }
  994. bool CardCondition(CardSource cardSource)
  995. {
  996. if (cardSource == null)
  997. {
  998. return false;
  999. }
  1000. if (cardSource.Owner != owner)
  1001. {
  1002. return false;
  1003. }
  1004. if (cardCondition == null || cardCondition(cardSource))
  1005. {
  1006. return true;
  1007. }
  1008. return false;
  1009. }
  1010. getIgnoreDigivolutionRequirementEffect = GainIgnoreDigivolutionRequirementPlayerEffect(
  1011. permanentCondition: PermanentCondition,
  1012. cardCondition: CardCondition,
  1013. ignoreDigivolutionRequirement: ignoreDigivolutionRequirement,
  1014. digivolutionCost: fixedCost,
  1015. activateClass: activateClass);
  1016. if (getIgnoreDigivolutionRequirementEffect != null)
  1017. {
  1018. AddEffectToPlayer(
  1019. effectDuration: EffectDuration.UntilCalculateFixedCost,
  1020. card: targetPermanent.TopCard,
  1021. cardEffect: null,
  1022. timing: EffectTiming.None,
  1023. getCardEffect: getIgnoreDigivolutionRequirementEffect);
  1024. }
  1025. }
  1026. #endregion
  1027. List<CardSource> selectedCards = new List<CardSource>();
  1028. IEnumerator SelectCardCoroutine(CardSource cardSource)
  1029. {
  1030. selectedCards.Add(cardSource);
  1031. yield return null;
  1032. }
  1033. if (owner.ExecutingCards.Count(CanSelectCardCondition) > 1)
  1034. {
  1035. int maxCount = 1;
  1036. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  1037. selectCardEffect.SetUp(
  1038. canTargetCondition: CanSelectCardCondition,
  1039. canTargetCondition_ByPreSelecetedList: null,
  1040. canEndSelectCondition: null,
  1041. canNoSelect: () => true,
  1042. selectCardCoroutine: SelectCardCoroutine,
  1043. afterSelectCardCoroutine: null,
  1044. message: "Select 1 card to digivolve.",
  1045. maxCount: maxCount,
  1046. canEndNotMax: false,
  1047. isShowOpponent: true,
  1048. mode: SelectCardEffect.Mode.Custom,
  1049. root: SelectCardEffect.Root.Execution,
  1050. customRootCardList: null,
  1051. canLookReverseCard: true,
  1052. selectPlayer: owner,
  1053. cardEffect: activateClass);
  1054. selectCardEffect.SetUpCustomMessage("Select 1 card to digivolve.", "The opponent is selecting 1 card to digivolve.");
  1055. selectCardEffect.SetUpCustomMessage_ShowCard("Selected Card");
  1056. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  1057. }
  1058. else
  1059. {
  1060. selectedCards.Add(activateClass.EffectSourceCard);
  1061. }
  1062. PlayCardClass playCardClass = new PlayCardClass(
  1063. cardSources: selectedCards,
  1064. hashtable: CardEffectHashtable(activateClass),
  1065. payCost: payCost,
  1066. targetPermanent: targetPermanent,
  1067. isTapped: false,
  1068. root: root,
  1069. activateETB: true);
  1070. playCardClass.SetIgnoreRequirements(ignoreRequirements);
  1071. if (!ignoreDigivolutionRequirement && fixedCost >= 0) playCardClass.SetFixedCost(fixedCost);
  1072. yield return ContinuousController.instance.StartCoroutine(playCardClass.PlayCard());
  1073. #region release effect
  1074. if (getChangeCostEffect != null) owner.UntilCalculateFixedCostEffect.Remove(getChangeCostEffect);
  1075. #endregion
  1076. #region release effect
  1077. if (getFixedCostEffect != null) owner.UntilCalculateFixedCostEffect.Remove(getFixedCostEffect);
  1078. #endregion
  1079. #region release effect
  1080. if (getIgnoreDigivolutionRequirementEffect != null) owner.UntilCalculateFixedCostEffect.Remove(getIgnoreDigivolutionRequirementEffect);
  1081. #endregion
  1082. if (selectedCards.Count >= 1)
  1083. {
  1084. if (IsDigivolvedByTheEffect(targetPermanent, selectedCards[0], activateClass))
  1085. {
  1086. if (successProcess != null)
  1087. {
  1088. yield return ContinuousController.instance.StartCoroutine(successProcess);
  1089. }
  1090. }
  1091. }
  1092. }
  1093. #endregion
  1094. #region Get the effect given by EffectTiming
  1095. public static Func<EffectTiming, ICardEffect> GetCardEffectByEffectTiming(EffectTiming timing, ICardEffect cardEffect) => (_timing) => _timing == timing ? cardEffect : null;
  1096. #endregion
  1097. #region Draw cards and trash cards
  1098. public static IEnumerator DrawAndDiscardCards((Player drawPlayer, Player trashPlayer) player,
  1099. int drawAmount,
  1100. int trashAmount,
  1101. CardSource card,
  1102. ICardEffect activateClass,
  1103. Func<CardSource, bool> canTrashTargetCondition = null,
  1104. Func<List<CardSource>, CardSource, bool> canTargetCondition_ByPreSelecetedList = null,
  1105. Func<List<CardSource>, bool> canEndSelectCondition = null,
  1106. bool canNoSelect = false,
  1107. bool canEndNotMax = false,
  1108. bool isShowOpponent = true,
  1109. Func<List<CardSource>, IEnumerator> afterSelectPermanentCoroutine = null)
  1110. {
  1111. // Callback Setup
  1112. Func<List<CardSource>, IEnumerator> AfterSelectCardCoroutine = afterSelectPermanentCoroutine ?? null;
  1113. // Variable setup
  1114. Func<CardSource, bool> targetTrashCondition = canTrashTargetCondition ?? (cs => true);
  1115. yield return ContinuousController.instance.StartCoroutine(new DrawClass(player.drawPlayer, drawAmount, activateClass).Draw());
  1116. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  1117. selectHandEffect.SetUp(
  1118. selectPlayer: player.trashPlayer,
  1119. canTargetCondition: targetTrashCondition,
  1120. canTargetCondition_ByPreSelecetedList: canTargetCondition_ByPreSelecetedList,
  1121. canEndSelectCondition: canEndSelectCondition,
  1122. maxCount: trashAmount,
  1123. canNoSelect: canNoSelect,
  1124. canEndNotMax: canEndNotMax,
  1125. isShowOpponent: isShowOpponent,
  1126. selectCardCoroutine: null,
  1127. afterSelectCardCoroutine: AfterSelectCardCoroutine,
  1128. mode: SelectHandEffect.Mode.Discard,
  1129. cardEffect: activateClass);
  1130. yield return ContinuousController.instance.StartCoroutine(selectHandEffect.Activate());
  1131. }
  1132. #endregion
  1133. }