BT21_091.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. // Spirit Evolution!
  6. namespace DCGO.CardEffects.BT21
  7. {
  8. public class BT21_091 : CEntity_Effect
  9. {
  10. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  11. {
  12. List<ICardEffect> cardEffects = new List<ICardEffect>();
  13. #region ignoring colors
  14. if (timing == EffectTiming.None)
  15. {
  16. IgnoreColorConditionClass ignoreColorConditionClass = new IgnoreColorConditionClass();
  17. ignoreColorConditionClass.SetUpICardEffect("Ignore color requirements", CanUseCondition, card);
  18. ignoreColorConditionClass.SetUpIgnoreColorConditionClass(cardCondition: CardCondition);
  19. cardEffects.Add(ignoreColorConditionClass);
  20. bool CanUseCondition(Hashtable hashtable)
  21. => CardEffectCommons.HasMatchConditionPermanent((permanent) => permanent.TopCard.Owner == card.Owner && permanent.IsTamer && permanent.TopCard.HasInheritedEffect, true);
  22. bool CardCondition(CardSource cardSource)
  23. => cardSource == card;
  24. }
  25. #endregion
  26. #region Main
  27. if (timing == EffectTiming.OptionSkill)
  28. {
  29. ActivateClass activateClass = new ActivateClass();
  30. activateClass.SetUpICardEffect("Trash 1 [Hybrid] card, Draw 2", CanUseCondition, card);
  31. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDiscription());
  32. cardEffects.Add(activateClass);
  33. string EffectDiscription()
  34. {
  35. return "[Main] By trashing 1 card with the [Hybrid] trait from your hand, <Draw 2> (Draw 2 cards from your deck). Then, place this card in the battle area.";
  36. }
  37. bool CanUseCondition(Hashtable hashtable)
  38. {
  39. return CardEffectCommons.CanTriggerOptionMainEffect(hashtable, card);
  40. }
  41. bool CanSelectCardCondiition(CardSource cardSource)
  42. {
  43. if (cardSource.Owner == card.Owner)
  44. {
  45. if (cardSource.EqualsTraits("Hybrid"))
  46. {
  47. return true;
  48. }
  49. }
  50. return false;
  51. }
  52. IEnumerator ActivateCoroutine(Hashtable hashtable)
  53. {
  54. if (CardEffectCommons.HasMatchConditionOwnersHand(card, CanSelectCardCondiition))
  55. {
  56. bool cardTrashed = false;
  57. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  58. selectHandEffect.SetUp(
  59. selectPlayer: card.Owner,
  60. canTargetCondition: CanSelectCardCondiition,
  61. canTargetCondition_ByPreSelecetedList: null,
  62. canEndSelectCondition: null,
  63. maxCount: 1,
  64. canNoSelect: true,
  65. canEndNotMax: false,
  66. isShowOpponent: true,
  67. selectCardCoroutine: null,
  68. afterSelectCardCoroutine: AfterSelectCardCoroutine,
  69. mode: SelectHandEffect.Mode.Discard,
  70. cardEffect: activateClass);
  71. selectHandEffect.SetUpCustomMessage("Select 1 card to discard.", "The opponent is selecting 1 card to discard.");
  72. selectHandEffect.SetUpCustomMessage_ShowCard("Selected Card");
  73. yield return StartCoroutine(selectHandEffect.Activate());
  74. IEnumerator AfterSelectCardCoroutine(List<CardSource> cardsSource)
  75. {
  76. if (CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, trashedCard => cardsSource[0] == trashedCard))
  77. {
  78. cardTrashed = true;
  79. }
  80. yield return null;
  81. }
  82. if (cardTrashed)
  83. yield return ContinuousController.instance.StartCoroutine(new DrawClass(card.Owner, 2, activateClass).Draw());
  84. }
  85. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlaceDelayOptionCards(card: card, cardEffect: activateClass));
  86. }
  87. }
  88. #endregion
  89. #region All Turns - Delay
  90. if (timing == EffectTiming.OnEnterFieldAnyone)
  91. {
  92. ActivateClass activateClass = new ActivateClass();
  93. activateClass.SetUpICardEffect("Your 1 Digimon digivolves", CanUseCondition, card);
  94. activateClass.SetUpActivateClass(CanActivateCondition, ActivateCoroutine, -1, true, EffectDiscription());
  95. cardEffects.Add(activateClass);
  96. string EffectDiscription()
  97. {
  98. return "[All Turns] When any of your Tamers with inherited effects are played, <Delay> (After this card is placed, by trashing it the next turn or later, activate the effect below).\r\n・1 of your Tamers may digivolve into a Digimon card with the [Hybrid] trait in the hand without paying the cost";
  99. }
  100. bool CanUseCondition(Hashtable hashtable)
  101. {
  102. if (CardEffectCommons.CanTriggerOnPermanentPlay(hashtable, PermamentConndition, null))
  103. {
  104. if (CardEffectCommons.CanDeclareOptionDelayEffect(card))
  105. {
  106. return true;
  107. }
  108. }
  109. return false;
  110. }
  111. bool CanActivateCondition(Hashtable hashtable)
  112. {
  113. return CardEffectCommons.CanDeclareOptionDelayEffect(card);
  114. }
  115. bool PermamentConndition(Permanent permanent)
  116. {
  117. if (CardEffectCommons.IsPermanentExistsOnOwnerBattleArea(permanent, card))
  118. {
  119. if (permanent.TopCard.IsTamer && permanent.TopCard.HasInheritedEffect)
  120. {
  121. return true;
  122. }
  123. }
  124. return false;
  125. }
  126. bool CanSelectCardCondition(CardSource cardSource)
  127. {
  128. if (cardSource.IsDigimon)
  129. {
  130. if (cardSource.EqualsTraits("Hybrid"))
  131. {
  132. return true;
  133. }
  134. }
  135. return false;
  136. }
  137. bool CanSelectPermanentCondition(Permanent permanent)
  138. {
  139. if (CardEffectCommons.IsPermanentExistsOnOwnerBattleArea(permanent, card))
  140. {
  141. if (permanent.IsTamer)
  142. {
  143. foreach (CardSource cardSource in card.Owner.HandCards)
  144. {
  145. if (CanSelectCardCondition(cardSource))
  146. {
  147. if (cardSource.CanPlayCardTargetFrame(permanent.PermanentFrame, false, activateClass))
  148. {
  149. return true;
  150. }
  151. }
  152. }
  153. }
  154. }
  155. return false;
  156. }
  157. IEnumerator ActivateCoroutine(Hashtable _hashtable)
  158. {
  159. bool destroyed = false;
  160. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.DeletePeremanentAndProcessAccordingToResult(targetPermanents: new List<Permanent>() { card.PermanentOfThisCard() }, activateClass: activateClass, successProcess: permanents => SuccessProcess(), failureProcess: null));
  161. IEnumerator SuccessProcess()
  162. {
  163. destroyed = true;
  164. yield return null;
  165. }
  166. if (destroyed)
  167. {
  168. if (CardEffectCommons.HasMatchConditionPermanent(CanSelectPermanentCondition))
  169. {
  170. Permanent selectedPermanent = null;
  171. SelectPermanentEffect selectPermanentEffect = GManager.instance.GetComponent<SelectPermanentEffect>();
  172. selectPermanentEffect.SetUp(
  173. selectPlayer: card.Owner,
  174. canTargetCondition: CanSelectPermanentCondition,
  175. canTargetCondition_ByPreSelecetedList: null,
  176. canEndSelectCondition: null,
  177. maxCount: 1,
  178. canNoSelect: true,
  179. canEndNotMax: false,
  180. selectPermanentCoroutine: SelectPermanentCoroutine,
  181. afterSelectPermanentCoroutine: null,
  182. mode: SelectPermanentEffect.Mode.Custom,
  183. cardEffect: activateClass);
  184. selectPermanentEffect.SetUpCustomMessage("Select 1 Digimon that will digivolve.", "The opponent is selecting 1 Digimon that will digivolve.");
  185. yield return ContinuousController.instance.StartCoroutine(selectPermanentEffect.Activate());
  186. IEnumerator SelectPermanentCoroutine(Permanent permanent)
  187. {
  188. selectedPermanent = permanent;
  189. yield return null;
  190. }
  191. if (selectedPermanent != null)
  192. {
  193. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.DigivolveIntoHandOrTrashCard(
  194. targetPermanent: selectedPermanent,
  195. cardCondition: CanSelectCardCondition,
  196. payCost: false,
  197. reduceCostTuple: null,
  198. fixedCostTuple: null,
  199. ignoreDigivolutionRequirementFixedCost: -1,
  200. isHand: true,
  201. activateClass: activateClass,
  202. successProcess: null));
  203. }
  204. }
  205. }
  206. }
  207. }
  208. #endregion
  209. #region Security
  210. if (timing == EffectTiming.SecuritySkill)
  211. {
  212. ActivateClass activateClass = new ActivateClass();
  213. activateClass.SetUpICardEffect("Play 1 Tamer with inherited effects", CanUseCondition, card);
  214. activateClass.SetUpActivateClass(CanActivateCondition, ActivateCoroutine, -1, false, EffectDiscription());
  215. activateClass.SetIsSecurityEffect(true);
  216. cardEffects.Add(activateClass);
  217. string EffectDiscription()
  218. {
  219. return "[Security] You may play 1 Tamer card with inherited effects from your hand or trash without paying the cost. Then, add this card to the hand.";
  220. }
  221. bool CanUseCondition(Hashtable hashtable)
  222. {
  223. if (CardEffectCommons.CanTriggerSecurityEffect(hashtable, card))
  224. {
  225. return true;
  226. }
  227. return false;
  228. }
  229. bool CanActivateCondition(Hashtable hashtable)
  230. {
  231. return CardEffectCommons.CanTriggerSecurityEffect(hashtable, card);
  232. }
  233. bool CanSelectCardCondition(CardSource cardSource)
  234. {
  235. if (cardSource.IsTamer)
  236. {
  237. if (cardSource.HasInheritedEffect)
  238. {
  239. return true;
  240. }
  241. }
  242. return false;
  243. }
  244. IEnumerator ActivateCoroutine(Hashtable _hashtable)
  245. {
  246. CardSource selectedCard = null;
  247. bool canSelectHand = CardEffectCommons.HasMatchConditionOwnersHand(card, CanSelectCardCondition);
  248. bool canSelectTrash = CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, CanSelectCardCondition);
  249. if (canSelectHand || canSelectTrash)
  250. {
  251. if (canSelectHand && canSelectTrash)
  252. {
  253. List<SelectionElement<bool>> selectionElements = new List<SelectionElement<bool>>()
  254. {
  255. new SelectionElement<bool>(message: $"From hand", value : true, spriteIndex: 0),
  256. new SelectionElement<bool>(message: $"From trash", value : false, spriteIndex: 1),
  257. };
  258. string selectPlayerMessage = "From which area do you select a card?";
  259. string notSelectPlayerMessage = "The opponent is choosing from which area to select a card.";
  260. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements, selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage, notSelectPlayerMessage: notSelectPlayerMessage);
  261. }
  262. else
  263. {
  264. GManager.instance.userSelectionManager.SetBool(canSelectHand);
  265. }
  266. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager.WaitForEndSelect());
  267. bool fromHand = GManager.instance.userSelectionManager.SelectedBoolValue;
  268. if (fromHand)
  269. {
  270. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  271. selectHandEffect.SetUp(
  272. selectPlayer: card.Owner,
  273. canTargetCondition: CanSelectCardCondition,
  274. canTargetCondition_ByPreSelecetedList: null,
  275. canEndSelectCondition: null,
  276. maxCount: 1,
  277. canNoSelect: true,
  278. canEndNotMax: false,
  279. isShowOpponent: true,
  280. selectCardCoroutine: SelectCardCoroutine,
  281. afterSelectCardCoroutine: null,
  282. mode: SelectHandEffect.Mode.Custom,
  283. cardEffect: activateClass);
  284. selectHandEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  285. selectHandEffect.SetUpCustomMessage_ShowCard("Selected Card");
  286. yield return StartCoroutine(selectHandEffect.Activate());
  287. }
  288. else
  289. {
  290. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  291. selectCardEffect.SetUp(
  292. canTargetCondition: CanSelectCardCondition,
  293. canTargetCondition_ByPreSelecetedList: null,
  294. canEndSelectCondition: null,
  295. canNoSelect: () => true,
  296. selectCardCoroutine: SelectCardCoroutine,
  297. afterSelectCardCoroutine: null,
  298. message: "Select 1 card to play.",
  299. maxCount: 1,
  300. canEndNotMax: false,
  301. isShowOpponent: true,
  302. mode: SelectCardEffect.Mode.Custom,
  303. root: SelectCardEffect.Root.Trash,
  304. customRootCardList: null,
  305. canLookReverseCard: true,
  306. selectPlayer: card.Owner,
  307. cardEffect: activateClass);
  308. selectCardEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  309. selectCardEffect.SetUpCustomMessage_ShowCard("Selected Card");
  310. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  311. }
  312. IEnumerator SelectCardCoroutine(CardSource cardSource)
  313. {
  314. selectedCard = cardSource;
  315. yield return null;
  316. }
  317. if (selectedCard != null)
  318. {
  319. var selectedRoot = fromHand ? SelectCardEffect.Root.Hand : SelectCardEffect.Root.Trash;
  320. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(cardSources: new List<CardSource>() { selectedCard }, activateClass: activateClass, payCost: false, isTapped: false, root: selectedRoot, activateETB: true));
  321. }
  322. }
  323. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.AddThisCardToHand(card, activateClass));
  324. }
  325. }
  326. #endregion
  327. return cardEffects;
  328. }
  329. }
  330. }