EX7_074.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace DCGO.CardEffects.EX7
  5. {
  6. public class EX7_074 : CEntity_Effect
  7. {
  8. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  9. {
  10. List<ICardEffect> cardEffects = new List<ICardEffect>();
  11. #region Ignore Color Requirement
  12. if (timing == EffectTiming.None)
  13. {
  14. IgnoreColorConditionClass ignoreColorConditionClass = new IgnoreColorConditionClass();
  15. ignoreColorConditionClass.SetUpICardEffect("Ignore color requirements", CanUseCondition, card);
  16. ignoreColorConditionClass.SetUpIgnoreColorConditionClass(cardCondition: CardCondition);
  17. cardEffects.Add(ignoreColorConditionClass);
  18. bool HasLiberatorTrait(Permanent permanent)
  19. {
  20. return (permanent.IsDigimon || permanent.IsTamer) &&
  21. (permanent.TopCard.ContainsTraits("Liberator") || permanent.TopCard.ContainsTraits("LIBERATOR"));
  22. }
  23. bool CanUseCondition(Hashtable hashtable)
  24. {
  25. return CardEffectCommons.HasMatchConditionOwnersPermanent(card, HasLiberatorTrait);
  26. }
  27. bool CardCondition(CardSource cardSource)
  28. {
  29. return cardSource == card;
  30. }
  31. }
  32. #endregion
  33. #region Main Effect
  34. if (timing == EffectTiming.OptionSkill)
  35. {
  36. ActivateClass activateClass = new ActivateClass();
  37. activateClass.SetUpICardEffect("Reveal top 3, Add 1 with [LIBERATOR] trait. Then digivolve 1 of your Digimon",
  38. CanUseCondition, card);
  39. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDiscription());
  40. cardEffects.Add(activateClass);
  41. string EffectDiscription()
  42. {
  43. return
  44. "[Main] Reveal the top 3 cards of your deck. Add 1 card with the [LIBERATOR] trait among them to the hand. Return the rest to the bottom of the deck. Then, 1 of your Digimon may digivolve into a Digimon card in your hand with the digivolution cost reduced by 4.";
  45. }
  46. bool IsLiberatorTraitCardCondition(CardSource cardSource)
  47. {
  48. return cardSource.ContainsTraits("Liberator") || cardSource.ContainsTraits("LIBERATOR");
  49. }
  50. bool CanSelectHandCardCondition(CardSource cardSource)
  51. {
  52. return cardSource.IsDigimon;
  53. }
  54. bool CanSelectOwnPermanentCondition(Permanent permanent)
  55. {
  56. return CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card) &&
  57. card.Owner.HandCards.Where(CanSelectHandCardCondition).Any(cardSource =>
  58. cardSource.CanPlayCardTargetFrame(permanent.PermanentFrame, false, activateClass));
  59. }
  60. bool CanUseCondition(Hashtable hashtable)
  61. {
  62. return CardEffectCommons.CanTriggerOptionMainEffect(hashtable, card);
  63. }
  64. IEnumerator ActivateCoroutine(Hashtable hashtable)
  65. {
  66. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.SimplifiedRevealDeckTopCardsAndSelect(
  67. revealCount: 3,
  68. simplifiedSelectCardConditions:
  69. new SimplifiedSelectCardConditionClass[]
  70. {
  71. new(
  72. canTargetCondition: IsLiberatorTraitCardCondition,
  73. message: "Select 1 card with [LIBERATOR] trait.",
  74. mode: SelectCardEffect.Mode.AddHand,
  75. maxCount: 1,
  76. selectCardCoroutine: null),
  77. },
  78. remainingCardsPlace: RemainingCardsPlace.DeckBottom,
  79. activateClass: activateClass
  80. ));
  81. if (CardEffectCommons.HasMatchConditionPermanent(CanSelectOwnPermanentCondition))
  82. {
  83. SelectPermanentEffect selectPermanentEffect = GManager.instance.GetComponent<SelectPermanentEffect>();
  84. selectPermanentEffect.SetUp(
  85. selectPlayer: card.Owner,
  86. canTargetCondition: CanSelectOwnPermanentCondition,
  87. canTargetCondition_ByPreSelecetedList: null,
  88. canEndSelectCondition: null,
  89. maxCount: 1,
  90. canNoSelect: true,
  91. canEndNotMax: false,
  92. selectPermanentCoroutine: SelectPermanentCoroutine,
  93. afterSelectPermanentCoroutine: null,
  94. mode: SelectPermanentEffect.Mode.Custom,
  95. cardEffect: activateClass);
  96. selectPermanentEffect.SetUpCustomMessage("Select 1 Digimon that will digivolve.",
  97. "The opponent is selecting 1 Digimon that will digivolve.");
  98. yield return ContinuousController.instance.StartCoroutine(selectPermanentEffect.Activate());
  99. IEnumerator SelectPermanentCoroutine(Permanent permanent)
  100. {
  101. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.DigivolveIntoHandOrTrashCard(
  102. targetPermanent: permanent,
  103. cardCondition: CanSelectHandCardCondition,
  104. payCost: true,
  105. reduceCostTuple: (reduceCost: 4, reduceCostCardCondition: null),
  106. fixedCostTuple: null,
  107. ignoreDigivolutionRequirementFixedCost: -1,
  108. isHand: true,
  109. activateClass: activateClass,
  110. successProcess: null));
  111. }
  112. }
  113. }
  114. }
  115. #endregion
  116. #region Security Effect
  117. if (timing == EffectTiming.SecuritySkill)
  118. {
  119. ActivateClass activateClass = new ActivateClass();
  120. activateClass.SetUpICardEffect($"Play 1 [LIBERATOR] trait card from hand or trash and add this card to hand",
  121. CanUseCondition, card);
  122. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDescription());
  123. activateClass.SetIsSecurityEffect(true);
  124. cardEffects.Add(activateClass);
  125. string EffectDescription()
  126. {
  127. return
  128. "[Security] You may play 1 card with the [LIBERATOR] trait with a play cost of 4 or less from your hand or trash without paying the cost. Then, add this card to the hand.";
  129. }
  130. bool CanUseCondition(Hashtable hashtable)
  131. {
  132. return CardEffectCommons.CanTriggerSecurityEffect(hashtable, card);
  133. }
  134. bool CanSelectCardCondition(CardSource cardSource)
  135. {
  136. return (cardSource.ContainsTraits("Liberator") || cardSource.ContainsTraits("LIBERATOR")) &&
  137. cardSource.HasPlayCost &&
  138. cardSource.GetCostItself <= 4 &&
  139. !cardSource.IsDigiEgg &&
  140. CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass);
  141. }
  142. IEnumerator ActivateCoroutine(Hashtable hashtable)
  143. {
  144. bool canSelectHand = CardEffectCommons.HasMatchConditionOwnersHand(card, CanSelectCardCondition);
  145. bool canSelectTrash = card.Owner.TrashCards.Some(CanSelectCardCondition);
  146. if (canSelectHand || canSelectTrash)
  147. {
  148. if (canSelectHand && canSelectTrash)
  149. {
  150. List<SelectionElement<bool>> selectionElements = new List<SelectionElement<bool>>
  151. {
  152. new(message: "From hand", value: true, spriteIndex: 0),
  153. new(message: "From trash", value: false, spriteIndex: 1),
  154. };
  155. string selectPlayerMessage = "From which area do you play a card?";
  156. string notSelectPlayerMessage = "The opponent is choosing from which area to play a card.";
  157. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements,
  158. selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage,
  159. notSelectPlayerMessage: notSelectPlayerMessage);
  160. }
  161. else
  162. {
  163. GManager.instance.userSelectionManager.SetBool(canSelectHand);
  164. }
  165. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager
  166. .WaitForEndSelect());
  167. bool fromHand = GManager.instance.userSelectionManager.SelectedBoolValue;
  168. List<CardSource> selectedCards = new List<CardSource>();
  169. IEnumerator SelectCardCoroutine(CardSource cardSource)
  170. {
  171. selectedCards.Add(cardSource);
  172. yield return null;
  173. }
  174. if (fromHand)
  175. {
  176. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  177. selectHandEffect.SetUp(
  178. selectPlayer: card.Owner,
  179. canTargetCondition: CanSelectCardCondition,
  180. canTargetCondition_ByPreSelecetedList: null,
  181. canEndSelectCondition: null,
  182. maxCount: 1,
  183. canNoSelect: true,
  184. canEndNotMax: false,
  185. isShowOpponent: true,
  186. selectCardCoroutine: SelectCardCoroutine,
  187. afterSelectCardCoroutine: null,
  188. mode: SelectHandEffect.Mode.Custom,
  189. cardEffect: activateClass);
  190. selectHandEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  191. selectHandEffect.SetUpCustomMessage_ShowCard("Played Card");
  192. yield return StartCoroutine(selectHandEffect.Activate());
  193. }
  194. else
  195. {
  196. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  197. selectCardEffect.SetUp(
  198. canTargetCondition: CanSelectCardCondition,
  199. canTargetCondition_ByPreSelecetedList: null,
  200. canEndSelectCondition: null,
  201. canNoSelect: () => true,
  202. selectCardCoroutine: SelectCardCoroutine,
  203. afterSelectCardCoroutine: null,
  204. message: "Select 1 card to play.",
  205. maxCount: 1,
  206. canEndNotMax: false,
  207. isShowOpponent: true,
  208. mode: SelectCardEffect.Mode.Custom,
  209. root: SelectCardEffect.Root.Trash,
  210. customRootCardList: null,
  211. canLookReverseCard: true,
  212. selectPlayer: card.Owner,
  213. cardEffect: activateClass);
  214. selectCardEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  215. selectCardEffect.SetUpCustomMessage_ShowCard("Played Card");
  216. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  217. }
  218. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(
  219. cardSources: selectedCards, activateClass: activateClass, payCost: false, isTapped: false,
  220. root: fromHand ? SelectCardEffect.Root.Hand : SelectCardEffect.Root.Trash,
  221. activateETB: true));
  222. }
  223. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.AddThisCardToHand(card, activateClass));
  224. }
  225. }
  226. #endregion
  227. return cardEffects;
  228. }
  229. }
  230. }