BT20_093.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System;
  5. // Unleash the Dragon-Gene
  6. namespace DCGO.CardEffects.BT20
  7. {
  8. public class BT20_093 : CEntity_Effect
  9. {
  10. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  11. {
  12. List<ICardEffect> cardEffects = new List<ICardEffect>();
  13. #region Main Effect
  14. if (timing == EffectTiming.OptionSkill)
  15. {
  16. ActivateClass activateClass = new ActivateClass();
  17. activateClass.SetUpICardEffect(card.BaseENGCardNameFromEntity, CanUseCondition, card);
  18. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDescription());
  19. cardEffects.Add(activateClass);
  20. string EffectDescription()
  21. {
  22. return
  23. "[Main] You may play 1 Digimon card with [Dracomon]/[Examon] in its text from your hand with the play cost reduced by 3. Then, place this card in the battle area.";
  24. }
  25. bool CanUseCondition(Hashtable hashtable)
  26. {
  27. return CardEffectCommons.CanTriggerOptionMainEffect(hashtable, card);
  28. }
  29. bool CanSelectCardCondition(CardSource cardSource)
  30. {
  31. return cardSource.IsDigimon &&
  32. (cardSource.HasText("Dracomon") || cardSource.HasText("Examon")) &&
  33. CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass);
  34. }
  35. IEnumerator ActivateCoroutine(Hashtable hashtable)
  36. {
  37. if (CardEffectCommons.HasMatchConditionOwnersHand(card, CanSelectCardCondition))
  38. {
  39. #region Reduce Play Cost
  40. ChangeCostClass changeCostClass = new ChangeCostClass();
  41. changeCostClass.SetUpICardEffect($"Play Cost -3", CanUseReduceCondition, card);
  42. changeCostClass.SetUpChangeCostClass(
  43. changeCostFunc: ChangeCost,
  44. cardSourceCondition: CardSourceCondition,
  45. rootCondition: RootCondition,
  46. isUpDown: IsUpDown,
  47. isCheckAvailability: () => false,
  48. isChangePayingCost: () => true);
  49. Func<EffectTiming, ICardEffect> getCardEffect = GetCardEffect;
  50. card.Owner.UntilCalculateFixedCostEffect.Add(getCardEffect);
  51. ICardEffect GetCardEffect(EffectTiming effectTiming)
  52. {
  53. if (effectTiming == EffectTiming.None)
  54. {
  55. return changeCostClass;
  56. }
  57. return null;
  58. }
  59. bool CanUseReduceCondition(Hashtable reduceHashtable)
  60. {
  61. return true;
  62. }
  63. int ChangeCost(CardSource cardSource, int cost, SelectCardEffect.Root root, List<Permanent> targetPermanents)
  64. {
  65. if (CardSourceCondition(cardSource)
  66. && RootCondition(root)
  67. && PermanentsCondition(targetPermanents))
  68. {
  69. cost -= 3;
  70. }
  71. return cost;
  72. }
  73. bool PermanentsCondition(List<Permanent> targetPermanents)
  74. {
  75. return targetPermanents == null
  76. || targetPermanents.Count((targetPermanent) => targetPermanent != null) == 0;
  77. }
  78. bool CardSourceCondition(CardSource cardSource)
  79. {
  80. return cardSource.HasPlayCost && CanSelectCardCondition(cardSource);
  81. }
  82. bool RootCondition(SelectCardEffect.Root root)
  83. {
  84. return true;
  85. }
  86. bool IsUpDown()
  87. {
  88. return true;
  89. }
  90. #endregion
  91. List<CardSource> selectedCards = new List<CardSource>();
  92. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  93. selectHandEffect.SetUp(
  94. selectPlayer: card.Owner,
  95. canTargetCondition: CanSelectCardCondition,
  96. canTargetCondition_ByPreSelecetedList: null,
  97. canEndSelectCondition: null,
  98. maxCount: 1,
  99. canNoSelect: true,
  100. canEndNotMax: false,
  101. isShowOpponent: true,
  102. selectCardCoroutine: SelectCardCoroutine,
  103. afterSelectCardCoroutine: null,
  104. mode: SelectHandEffect.Mode.Custom,
  105. cardEffect: activateClass);
  106. selectHandEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  107. selectHandEffect.SetUpCustomMessage_ShowCard("Played Card");
  108. yield return ContinuousController.instance.StartCoroutine(selectHandEffect.Activate());
  109. IEnumerator SelectCardCoroutine(CardSource cardSource)
  110. {
  111. selectedCards.Add(cardSource);
  112. yield return null;
  113. }
  114. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(
  115. cardSources: selectedCards,
  116. activateClass: activateClass,
  117. payCost: true,
  118. isTapped: false,
  119. root: SelectCardEffect.Root.Hand,
  120. activateETB: true));
  121. #region Remove Reduction
  122. card.Owner.UntilCalculateFixedCostEffect.Remove(getCardEffect);
  123. #endregion
  124. }
  125. yield return ContinuousController.instance.StartCoroutine(
  126. CardEffectCommons.PlaceDelayOptionCards(card: card, cardEffect: activateClass));
  127. }
  128. }
  129. #endregion
  130. #region Delay Effect
  131. if (timing == EffectTiming.WhenRemoveField)
  132. {
  133. ActivateClass activateClass = new ActivateClass();
  134. activateClass.SetUpICardEffect("2 of your Digimon may DNA digivolve into [Examon]", CanUseCondition, card);
  135. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, true, EffectDescription());
  136. activateClass.SetHashString("DNAExamon_BT20_093");
  137. cardEffects.Add(activateClass);
  138. string EffectDescription()
  139. {
  140. return
  141. "[All Turns] When any of your Digimon with [Dracomon]/[Examon] in their texts would leave the battle area other than in battle, [Delay].・ 2 of your Digimon may DNA digivolve into [Examon] in the hand.";
  142. }
  143. bool CanUseCondition(Hashtable hashtable)
  144. {
  145. return CardEffectCommons.CanDeclareOptionDelayEffect(card) &&
  146. CardEffectCommons.CanTriggerWhenPermanentRemoveField(hashtable, PermanentCondition) &&
  147. !CardEffectCommons.IsByBattle(hashtable);
  148. }
  149. bool PermanentCondition(Permanent permanent)
  150. {
  151. return CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card) &&
  152. (permanent.TopCard.HasText("Dracomon") || permanent.TopCard.HasText("Examon"));
  153. }
  154. bool CanSelectDNACardCondition(CardSource cardSource)
  155. {
  156. return cardSource.IsDigimon &&
  157. cardSource.CanPlayJogress(true) &&
  158. cardSource.ContainsCardName("Examon");
  159. }
  160. IEnumerator ActivateCoroutine(Hashtable hashtable)
  161. {
  162. yield return ContinuousController.instance.StartCoroutine(
  163. CardEffectCommons.DeletePeremanentAndProcessAccordingToResult(
  164. targetPermanents: new List<Permanent>() { card.PermanentOfThisCard() },
  165. activateClass: activateClass, successProcess: _ => SuccessProcess(),
  166. failureProcess: null));
  167. }
  168. IEnumerator SuccessProcess()
  169. {
  170. yield return ContinuousController.instance.StartCoroutine(
  171. CardEffectCommons.DNADigivolvePermanentsIntoHandOrTrashCard(
  172. CanSelectDNACardCondition,
  173. payCost: true,
  174. isHand: true,
  175. activateClass
  176. ));
  177. }
  178. }
  179. #endregion
  180. #region Security Effect
  181. if (timing == EffectTiming.SecuritySkill)
  182. {
  183. ActivateClass activateClass = new ActivateClass();
  184. activateClass.SetUpICardEffect("Play 1 [Dracomon] card from hand or trash", CanUseCondition, card);
  185. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDescription());
  186. activateClass.SetIsSecurityEffect(true);
  187. cardEffects.Add(activateClass);
  188. string EffectDescription()
  189. {
  190. return
  191. "[Security] You may play 1 Digimon card with [Dracomon] in its name from your hand or trash without paying the cost. Then, place this card in the battle area.";
  192. }
  193. bool CanUseCondition(Hashtable hashtable)
  194. {
  195. return CardEffectCommons.CanTriggerSecurityEffect(hashtable, card);
  196. }
  197. bool CanSelectCardCondition(CardSource cardSource)
  198. {
  199. return cardSource.IsDigimon &&
  200. cardSource.ContainsCardName("Dracomon") &&
  201. CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass);
  202. }
  203. IEnumerator ActivateCoroutine(Hashtable hashtable)
  204. {
  205. bool canSelectHand = CardEffectCommons.HasMatchConditionOwnersHand(card, CanSelectCardCondition);
  206. bool canSelectTrash = CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, CanSelectCardCondition);
  207. if (canSelectHand || canSelectTrash)
  208. {
  209. if (canSelectHand && canSelectTrash)
  210. {
  211. List<SelectionElement<bool>> selectionElements = new List<SelectionElement<bool>>
  212. {
  213. new(message: "From hand", value: true, spriteIndex: 0),
  214. new(message: "From trash", value: false, spriteIndex: 1),
  215. };
  216. string selectPlayerMessage = "From which area do you play a card?";
  217. string notSelectPlayerMessage = "The opponent is choosing from which area to play a card.";
  218. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements,
  219. selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage,
  220. notSelectPlayerMessage: notSelectPlayerMessage);
  221. }
  222. else
  223. {
  224. GManager.instance.userSelectionManager.SetBool(canSelectHand);
  225. }
  226. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager
  227. .WaitForEndSelect());
  228. bool fromHand = GManager.instance.userSelectionManager.SelectedBoolValue;
  229. List<CardSource> selectedCards = new List<CardSource>();
  230. IEnumerator SelectCardCoroutine(CardSource cardSource)
  231. {
  232. selectedCards.Add(cardSource);
  233. yield return null;
  234. }
  235. if (fromHand)
  236. {
  237. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  238. selectHandEffect.SetUp(
  239. selectPlayer: card.Owner,
  240. canTargetCondition: CanSelectCardCondition,
  241. canTargetCondition_ByPreSelecetedList: null,
  242. canEndSelectCondition: null,
  243. maxCount: 1,
  244. canNoSelect: true,
  245. canEndNotMax: false,
  246. isShowOpponent: true,
  247. selectCardCoroutine: SelectCardCoroutine,
  248. afterSelectCardCoroutine: null,
  249. mode: SelectHandEffect.Mode.Custom,
  250. cardEffect: activateClass);
  251. selectHandEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  252. selectHandEffect.SetUpCustomMessage_ShowCard("Played Card");
  253. yield return StartCoroutine(selectHandEffect.Activate());
  254. }
  255. else
  256. {
  257. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  258. selectCardEffect.SetUp(
  259. canTargetCondition: CanSelectCardCondition,
  260. canTargetCondition_ByPreSelecetedList: null,
  261. canEndSelectCondition: null,
  262. canNoSelect: () => true,
  263. selectCardCoroutine: SelectCardCoroutine,
  264. afterSelectCardCoroutine: null,
  265. message: "Select 1 card to play.",
  266. maxCount: 1,
  267. canEndNotMax: false,
  268. isShowOpponent: true,
  269. mode: SelectCardEffect.Mode.Custom,
  270. root: SelectCardEffect.Root.Trash,
  271. customRootCardList: null,
  272. canLookReverseCard: true,
  273. selectPlayer: card.Owner,
  274. cardEffect: activateClass);
  275. selectCardEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  276. selectCardEffect.SetUpCustomMessage_ShowCard("Played Card");
  277. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  278. }
  279. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(
  280. cardSources: selectedCards, activateClass: activateClass, payCost: false, isTapped: false,
  281. root: fromHand ? SelectCardEffect.Root.Hand : SelectCardEffect.Root.Trash, activateETB: true));
  282. }
  283. yield return ContinuousController.instance.StartCoroutine(
  284. CardEffectCommons.PlaceDelayOptionCards(card: card, cardEffect: activateClass));
  285. }
  286. }
  287. #endregion
  288. return cardEffects;
  289. }
  290. }
  291. }