BT20_097.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace DCGO.CardEffects.BT20
  5. {
  6. public class BT20_097 : CEntity_Effect
  7. {
  8. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  9. {
  10. List<ICardEffect> cardEffects = new List<ICardEffect>();
  11. #region Main
  12. if (timing == EffectTiming.OptionSkill)
  13. {
  14. ActivateClass activateClass = new ActivateClass();
  15. activateClass.SetUpICardEffect("May Digivolve into level 6 or lower, then place in battle area", CanUseCondition, card);
  16. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDiscription());
  17. cardEffects.Add(activateClass);
  18. string EffectDiscription()
  19. {
  20. return "[Main] 1 of your Digimon may digivolve into a level 6 or lower Digimon card with [Dex] or [DeathX] in its name in the trash with the digivolution cost reduced by 4. Then, place this card in the battle area.";
  21. }
  22. bool CanSelectPermanentCondition(Permanent permanent)
  23. {
  24. if (CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card))
  25. {
  26. foreach (CardSource cardSource in card.Owner.TrashCards)
  27. {
  28. if (CanSelectCardCondition(cardSource))
  29. {
  30. if (cardSource.CanPlayCardTargetFrame(permanent.PermanentFrame, false, activateClass))
  31. {
  32. return true;
  33. }
  34. }
  35. }
  36. }
  37. return false;
  38. }
  39. bool CanSelectCardCondition(CardSource cardSource)
  40. {
  41. if (cardSource.IsDigimon)
  42. {
  43. if (cardSource.HasLevel && cardSource.Level <= 6)
  44. {
  45. if (cardSource.ContainsCardName("Dex"))
  46. {
  47. return true;
  48. }
  49. if (cardSource.ContainsCardName("DeathX"))
  50. {
  51. return true;
  52. }
  53. }
  54. }
  55. return false;
  56. }
  57. bool CanUseCondition(Hashtable hashtable)
  58. {
  59. return CardEffectCommons.CanTriggerOptionMainEffect(hashtable, card);
  60. }
  61. IEnumerator ActivateCoroutine(Hashtable hashtable)
  62. {
  63. if (CardEffectCommons.HasMatchConditionPermanent(CanSelectPermanentCondition))
  64. {
  65. Permanent selectedPermanent = null;
  66. SelectPermanentEffect selectPermanentEffect = GManager.instance.GetComponent<SelectPermanentEffect>();
  67. selectPermanentEffect.SetUp(
  68. selectPlayer: card.Owner,
  69. canTargetCondition: CanSelectPermanentCondition,
  70. canTargetCondition_ByPreSelecetedList: null,
  71. canEndSelectCondition: null,
  72. maxCount: 1,
  73. canNoSelect: true,
  74. canEndNotMax: false,
  75. selectPermanentCoroutine: SelectPermanentCoroutine,
  76. afterSelectPermanentCoroutine: null,
  77. mode: SelectPermanentEffect.Mode.Custom,
  78. cardEffect: activateClass);
  79. selectPermanentEffect.SetUpCustomMessage("Select 1 Digimon that will digivolve.", "The opponent is selecting 1 Digimon that will digivolve.");
  80. yield return ContinuousController.instance.StartCoroutine(selectPermanentEffect.Activate());
  81. IEnumerator SelectPermanentCoroutine(Permanent permanent)
  82. {
  83. selectedPermanent = permanent;
  84. yield return null;
  85. }
  86. if (selectedPermanent != null)
  87. {
  88. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.DigivolveIntoHandOrTrashCard(
  89. targetPermanent: selectedPermanent,
  90. cardCondition: CanSelectCardCondition,
  91. payCost: true,
  92. reduceCostTuple: (reduceCost: 4, reduceCostCardCondition: null),
  93. fixedCostTuple: null,
  94. ignoreDigivolutionRequirementFixedCost: -1,
  95. isHand: false,
  96. activateClass: activateClass,
  97. successProcess: null));
  98. }
  99. }
  100. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlaceDelayOptionCards(card: card, cardEffect: activateClass));
  101. }
  102. }
  103. #endregion
  104. #region All Turns - Delay
  105. if (timing == EffectTiming.WhenRemoveField)
  106. {
  107. ActivateClass activateClass = new ActivateClass();
  108. activateClass.SetUpICardEffect("Play 1 [DeathXmon]", CanUseCondition, card);
  109. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, true, EffectDescription());
  110. cardEffects.Add(activateClass);
  111. string EffectDescription()
  112. {
  113. return "[All Turns] When any of your [DexDorugoramon] would leave the battle area, <Delay>.\r\n• By return 1 [Dorumon] from those Digimon's digivolution cards to the hand, you may play 1 [DeathXmon] from your trash without paying the cost.";
  114. }
  115. bool DexDorugora(Permanent permanent)
  116. {
  117. return CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card) &&
  118. permanent.TopCard.EqualsCardName("DexDorugoramon") &&
  119. permanent.willBeRemoveField;
  120. }
  121. bool DexDorugoraWithSource(Permanent permanent)
  122. {
  123. return CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card) &&
  124. permanent.TopCard.EqualsCardName("DexDorugoramon") &&
  125. permanent.willBeRemoveField &&
  126. permanent.DigivolutionCards.Count(DorumonSource) > 0;
  127. }
  128. bool DorumonSource(CardSource source)
  129. {
  130. return source.EqualsCardName("Dorumon");
  131. }
  132. bool IsDeathXmon(CardSource source)
  133. {
  134. return source.EqualsCardName("DeathXmon") &&
  135. CardEffectCommons.CanPlayAsNewPermanent(source, false, activateClass, SelectCardEffect.Root.Trash);
  136. }
  137. bool CanUseCondition(Hashtable hashtable)
  138. {
  139. return CardEffectCommons.CanTriggerWhenPermanentRemoveField(hashtable, DexDorugora) &&
  140. CardEffectCommons.CanDeclareOptionDelayEffect(card);
  141. }
  142. IEnumerator ActivateCoroutine(Hashtable hashtable)
  143. {
  144. Permanent selectedPermanent = null;
  145. yield return ContinuousController.instance.StartCoroutine(
  146. CardEffectCommons.DeletePeremanentAndProcessAccordingToResult(
  147. targetPermanents: new List<Permanent>() { card.PermanentOfThisCard() },
  148. activateClass: activateClass, successProcess: _ => SuccessProcess(),
  149. failureProcess: null));
  150. IEnumerator SuccessProcess()
  151. {
  152. SelectPermanentEffect selectPermanentEffect = GManager.instance.GetComponent<SelectPermanentEffect>();
  153. selectPermanentEffect.SetUp(
  154. selectPlayer: card.Owner,
  155. canTargetCondition: DexDorugoraWithSource,
  156. canTargetCondition_ByPreSelecetedList: null,
  157. canEndSelectCondition: null,
  158. maxCount: 1,
  159. canNoSelect: true,
  160. canEndNotMax: false,
  161. selectPermanentCoroutine: SelectPermanentCoroutine,
  162. afterSelectPermanentCoroutine: null,
  163. mode: SelectPermanentEffect.Mode.Custom,
  164. cardEffect: activateClass);
  165. selectPermanentEffect.SetUpCustomMessage("Select 1 Digimon to return 1 source to hand.", "The opponent is selecting 1 return 1 source to hand.");
  166. yield return ContinuousController.instance.StartCoroutine(selectPermanentEffect.Activate());
  167. IEnumerator SelectPermanentCoroutine(Permanent permanent)
  168. {
  169. selectedPermanent = permanent;
  170. yield return null;
  171. }
  172. }
  173. if(selectedPermanent != null)
  174. {
  175. bool cardAdded = false;
  176. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  177. selectCardEffect.SetUp(
  178. canTargetCondition: DorumonSource,
  179. canTargetCondition_ByPreSelecetedList: null,
  180. canEndSelectCondition: null,
  181. canNoSelect: () => false,
  182. selectCardCoroutine: null,
  183. afterSelectCardCoroutine: SelectDorumonCoroutine,
  184. message: "Select 1 digivolution card.",
  185. maxCount: 1,
  186. canEndNotMax: false,
  187. isShowOpponent: true,
  188. mode: SelectCardEffect.Mode.AddHand,
  189. root: SelectCardEffect.Root.Custom,
  190. customRootCardList: selectedPermanent.DigivolutionCards,
  191. canLookReverseCard: true,
  192. selectPlayer: card.Owner,
  193. cardEffect: activateClass);
  194. selectCardEffect.SetUpCustomMessage("Select 1 [Dorumon] to return to hand.", "The opponent is selecting 1 [Dorumon] to return to hand.");
  195. selectCardEffect.SetUpCustomMessage_ShowCard("Digivolution Card");
  196. yield return StartCoroutine(selectCardEffect.Activate());
  197. IEnumerator SelectDorumonCoroutine(List<CardSource> cardSources)
  198. {
  199. cardAdded = true;
  200. yield return null;
  201. }
  202. if (cardAdded)
  203. {
  204. List<CardSource> selectedPlayedCards = new List<CardSource>();
  205. selectCardEffect.SetUp(
  206. canTargetCondition: IsDeathXmon,
  207. canTargetCondition_ByPreSelecetedList: null,
  208. canEndSelectCondition: null,
  209. canNoSelect: () => false,
  210. selectCardCoroutine: SelectCardCoroutine,
  211. afterSelectCardCoroutine: null,
  212. message: "Select 1 [DeathXmon] to play.",
  213. maxCount: 1,
  214. canEndNotMax: false,
  215. isShowOpponent: true,
  216. mode: SelectCardEffect.Mode.Custom,
  217. root: SelectCardEffect.Root.Trash,
  218. customRootCardList: null,
  219. canLookReverseCard: true,
  220. selectPlayer: card.Owner,
  221. cardEffect: activateClass);
  222. selectCardEffect.SetUpCustomMessage("Select 1 [DeathXmon] to play.", "The opponent is selecting 1 [DeathXmon] to play.");
  223. yield return StartCoroutine(selectCardEffect.Activate());
  224. IEnumerator SelectCardCoroutine(CardSource cardSource)
  225. {
  226. selectedPlayedCards.Add(cardSource);
  227. yield return null;
  228. }
  229. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(cardSources: selectedPlayedCards, activateClass: activateClass, payCost: false, isTapped: false, root: SelectCardEffect.Root.Trash, activateETB: true));
  230. }
  231. }
  232. }
  233. }
  234. #endregion
  235. #region Security Effect
  236. if (timing == EffectTiming.SecuritySkill)
  237. {
  238. ActivateClass activateClass = new ActivateClass();
  239. activateClass.SetUpICardEffect($"Play 1 [Dorumon] from your hand or trash", CanUseCondition, card);
  240. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDiscription());
  241. activateClass.SetIsSecurityEffect(true);
  242. cardEffects.Add(activateClass);
  243. string EffectDiscription()
  244. {
  245. return "[Security] You may play 1 [Dorumon] from your hand or trash without paying the cost. Then, place this card in the battle area.";
  246. }
  247. bool CanSelectCardCondition(CardSource cardSource)
  248. {
  249. if (cardSource != null)
  250. {
  251. if (cardSource.Owner == card.Owner)
  252. {
  253. if (CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass))
  254. {
  255. if (cardSource.EqualsCardName("Dorumon"))
  256. {
  257. return true;
  258. }
  259. }
  260. }
  261. }
  262. return false;
  263. }
  264. bool CanUseCondition(Hashtable hashtable)
  265. {
  266. return CardEffectCommons.CanTriggerSecurityEffect(hashtable, card);
  267. }
  268. IEnumerator ActivateCoroutine(Hashtable _hashtable)
  269. {
  270. bool canSelectHand = CardEffectCommons.HasMatchConditionOwnersHand(card, CanSelectCardCondition);
  271. bool canSelectTrash = CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, CanSelectCardCondition);
  272. if (canSelectHand || canSelectTrash)
  273. {
  274. if (canSelectHand && canSelectTrash)
  275. {
  276. List<SelectionElement<bool>> selectionElements = new List<SelectionElement<bool>>()
  277. {
  278. new SelectionElement<bool>(message: $"From hand", value : true, spriteIndex: 0),
  279. new SelectionElement<bool>(message: $"From trash", value : false, spriteIndex: 1),
  280. };
  281. string selectPlayerMessage = "From which area do you play a card?";
  282. string notSelectPlayerMessage = "The opponent is choosing from which area to play a card.";
  283. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements, selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage, notSelectPlayerMessage: notSelectPlayerMessage);
  284. }
  285. else
  286. {
  287. GManager.instance.userSelectionManager.SetBool(canSelectHand);
  288. }
  289. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager.WaitForEndSelect());
  290. bool fromHand = GManager.instance.userSelectionManager.SelectedBoolValue;
  291. List<CardSource> selectedCards = new List<CardSource>();
  292. IEnumerator SelectCardCoroutine(CardSource cardSource)
  293. {
  294. selectedCards.Add(cardSource);
  295. yield return null;
  296. }
  297. if (fromHand)
  298. {
  299. int maxCount = 1;
  300. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  301. selectHandEffect.SetUp(
  302. selectPlayer: card.Owner,
  303. canTargetCondition: CanSelectCardCondition,
  304. canTargetCondition_ByPreSelecetedList: null,
  305. canEndSelectCondition: null,
  306. maxCount: maxCount,
  307. canNoSelect: true,
  308. canEndNotMax: false,
  309. isShowOpponent: true,
  310. selectCardCoroutine: SelectCardCoroutine,
  311. afterSelectCardCoroutine: null,
  312. mode: SelectHandEffect.Mode.Custom,
  313. cardEffect: activateClass);
  314. selectHandEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  315. selectHandEffect.SetUpCustomMessage_ShowCard("Played Card");
  316. yield return StartCoroutine(selectHandEffect.Activate());
  317. }
  318. else
  319. {
  320. int maxCount = 1;
  321. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  322. selectCardEffect.SetUp(
  323. canTargetCondition: CanSelectCardCondition,
  324. canTargetCondition_ByPreSelecetedList: null,
  325. canEndSelectCondition: null,
  326. canNoSelect: () => true,
  327. selectCardCoroutine: SelectCardCoroutine,
  328. afterSelectCardCoroutine: null,
  329. message: "Select 1 card to play.",
  330. maxCount: maxCount,
  331. canEndNotMax: false,
  332. isShowOpponent: true,
  333. mode: SelectCardEffect.Mode.Custom,
  334. root: SelectCardEffect.Root.Trash,
  335. customRootCardList: null,
  336. canLookReverseCard: true,
  337. selectPlayer: card.Owner,
  338. cardEffect: activateClass);
  339. selectCardEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  340. selectCardEffect.SetUpCustomMessage_ShowCard("Played Card");
  341. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  342. }
  343. SelectCardEffect.Root root = SelectCardEffect.Root.Hand;
  344. if (!fromHand)
  345. {
  346. root = SelectCardEffect.Root.Trash;
  347. }
  348. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(
  349. cardSources: selectedCards,
  350. activateClass: activateClass,
  351. payCost: false,
  352. isTapped: false,
  353. root: root,
  354. activateETB: true));
  355. }
  356. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.AddThisCardToHand(card, activateClass));
  357. }
  358. }
  359. #endregion
  360. return cardEffects;
  361. }
  362. }
  363. }