EX11_069.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. // Yuuki
  6. namespace DCGO.CardEffects.EX11
  7. {
  8. public class EX11_069 : CEntity_Effect
  9. {
  10. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  11. {
  12. List<ICardEffect> cardEffects = new List<ICardEffect>();
  13. #region Security Effect
  14. if (timing == EffectTiming.SecuritySkill)
  15. {
  16. cardEffects.Add(CardEffectFactory.PlaySelfTamerSecurityEffect(card));
  17. }
  18. #endregion
  19. #region SoYMP/OP Shared
  20. string SharedEffectName()
  21. {
  22. return "Trash a card to gain 1 memory.";
  23. }
  24. string SharedEffectDescription(string tag)
  25. {
  26. return $"[{tag}] By trashing 1 card in your hand, gain 1 memory.";
  27. }
  28. bool SharedCanActivateCondition(Hashtable hashtable)
  29. {
  30. return CardEffectCommons.IsExistOnBattleArea(card)
  31. && card.Owner.HandCards.Count >= 1;
  32. }
  33. IEnumerator SharedActivateCoroutine(Hashtable hashtable, ActivateClass activateClass)
  34. {
  35. bool discarded = false;
  36. int discardCount = 1;
  37. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  38. selectHandEffect.SetUp(
  39. selectPlayer: card.Owner,
  40. canTargetCondition: (cardSource) => true,
  41. canTargetCondition_ByPreSelecetedList: null,
  42. canEndSelectCondition: null,
  43. maxCount: discardCount,
  44. canNoSelect: true,
  45. canEndNotMax: false,
  46. isShowOpponent: true,
  47. selectCardCoroutine: null,
  48. afterSelectCardCoroutine: AfterSelectCardCoroutine,
  49. mode: SelectHandEffect.Mode.Discard,
  50. cardEffect: activateClass);
  51. yield return StartCoroutine(selectHandEffect.Activate());
  52. IEnumerator AfterSelectCardCoroutine(List<CardSource> cardSources)
  53. {
  54. if (cardSources.Count >= 1)
  55. {
  56. discarded = true;
  57. yield return null;
  58. }
  59. }
  60. if (discarded)
  61. {
  62. yield return ContinuousController.instance.StartCoroutine(card.Owner.AddMemory(1, activateClass));
  63. }
  64. }
  65. #endregion
  66. #region Start of Your Main Phase
  67. if (timing == EffectTiming.OnStartMainPhase)
  68. {
  69. ActivateClass activateClass = new ActivateClass();
  70. activateClass.SetUpICardEffect(SharedEffectName(), CanUseCondition, card);
  71. activateClass.SetUpActivateClass(SharedCanActivateCondition, hash => SharedActivateCoroutine(hash, activateClass), -1, false, SharedEffectDescription("Start of Your Main Phase"));
  72. cardEffects.Add(activateClass);
  73. bool CanUseCondition(Hashtable hashtable)
  74. {
  75. return CardEffectCommons.IsExistOnBattleArea(card)
  76. && CardEffectCommons.IsOwnerTurn(card);
  77. }
  78. }
  79. #endregion
  80. #region On Play
  81. if (timing == EffectTiming.OnEnterFieldAnyone)
  82. {
  83. ActivateClass activateClass = new ActivateClass();
  84. activateClass.SetUpICardEffect(SharedEffectName(), CanUseCondition, card);
  85. activateClass.SetUpActivateClass(SharedCanActivateCondition, hash => SharedActivateCoroutine(hash, activateClass), -1, false, SharedEffectDescription("On Play"));
  86. cardEffects.Add(activateClass);
  87. bool CanUseCondition(Hashtable hashtable)
  88. {
  89. return CardEffectCommons.IsExistOnBattleArea(card)
  90. && CardEffectCommons.CanTriggerOnPlay(hashtable, card);
  91. }
  92. }
  93. #endregion
  94. #region Your Turn
  95. if (timing == EffectTiming.OnAllyAttack)
  96. {
  97. ActivateClass activateClass = new ActivateClass();
  98. activateClass.SetUpICardEffect("Digivolve attacking digimon to [Dark Dragon]/[Evil Dragon] trait for 1 less.", CanUseCondition, card);
  99. activateClass.SetUpActivateClass(CanActivateCondition, ActivateCoroutine, 1, true, EffectDescription());
  100. activateClass.SetHashString("EX11_069_YT");
  101. cardEffects.Add(activateClass);
  102. string EffectDescription()
  103. => "[Your Turn] [Once Per Turn] When one of your Digimon attacks, if you have 4 or fewer cards in your hand, it may digivolve into a [Dark Dragon] or [Evil Dragon] trait Digimon card in the trash with the digivolution cost reduced by 1.";
  104. bool CanUseCondition(Hashtable hashtable)
  105. => CardEffectCommons.IsExistOnBattleArea(card)
  106. && CardEffectCommons.IsOwnerTurn(card)
  107. && CardEffectCommons.CanTriggerOnPermanentAttack(hashtable, PermanentCondition);
  108. bool CanActivateCondition(Hashtable hashtable)
  109. => CardEffectCommons.IsExistOnBattleArea(card)
  110. && CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, CanSelectCardCondition)
  111. && card.Owner.HandCards.Count <= 4;
  112. bool PermanentCondition(Permanent permanent)
  113. => CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card);
  114. bool CanSelectCardCondition(CardSource cardSource)
  115. => cardSource.IsDigimon
  116. && (cardSource.EqualsTraits("Dark Dragon") || cardSource.EqualsTraits("Evil Dragon"));
  117. IEnumerator ActivateCoroutine(Hashtable hashtable)
  118. {
  119. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.DigivolveIntoHandOrTrashCard(
  120. targetPermanent: GManager.instance.attackProcess.AttackingPermanent,
  121. cardCondition: CanSelectCardCondition,
  122. payCost: true,
  123. reduceCostTuple: (reduceCost: 1, reduceCostCardCondition: null),
  124. fixedCostTuple: null,
  125. ignoreDigivolutionRequirementFixedCost: -1,
  126. isHand: false,
  127. activateClass: activateClass,
  128. successProcess: null));
  129. }
  130. }
  131. #endregion
  132. #region End of All Turns
  133. if (timing == EffectTiming.OnEndTurn)
  134. {
  135. ActivateClass activateClass = new ActivateClass();
  136. activateClass.SetUpICardEffect("Suspend tamer to recover 1 [Evil], [Dark Dragon] or [Evil Dragon] trait card.", CanUseCondition, card);
  137. activateClass.SetUpActivateClass(CanActivateCondition, ActivateCoroutine, -1, true, EffectDescription());
  138. cardEffects.Add(activateClass);
  139. string EffectDescription()
  140. {
  141. return "[End of All Turns] If you have 4 or fewer cards in your hand, by suspending this Tamer, you may return 1 [Evil], [Dark Dragon] or [Evil Dragon] trait card from your trash to the hand.";
  142. }
  143. bool CanUseCondition(Hashtable hashtable)
  144. {
  145. return CardEffectCommons.IsExistOnBattleArea(card);
  146. }
  147. bool CanActivateCondition(Hashtable hashtable)
  148. {
  149. return CardEffectCommons.IsExistOnBattleArea(card)
  150. && card.Owner.HandCards.Count <= 4
  151. && CardEffectCommons.CanActivateSuspendCostEffect(card);
  152. }
  153. bool CanSelectCardCondition(CardSource cardSource)
  154. {
  155. return cardSource.EqualsTraits("Evil")
  156. || cardSource.EqualsTraits("Dark Dragon")
  157. || cardSource.EqualsTraits("Evil Dragon");
  158. }
  159. IEnumerator ActivateCoroutine(Hashtable hashtable)
  160. {
  161. yield return ContinuousController.instance.StartCoroutine(
  162. new SuspendPermanentsClass(new List<Permanent>() { card.PermanentOfThisCard() },
  163. CardEffectCommons.CardEffectHashtable(activateClass)).Tap());
  164. int maxCount = Math.Min(1, card.Owner.TrashCards.Count(CanSelectCardCondition));
  165. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  166. selectCardEffect.SetUp(
  167. canTargetCondition: CanSelectCardCondition,
  168. canTargetCondition_ByPreSelecetedList: null,
  169. canEndSelectCondition: null,
  170. canNoSelect: () => true,
  171. selectCardCoroutine: null,
  172. afterSelectCardCoroutine: null,
  173. message: "Select 1 card to add to your hand.",
  174. maxCount: maxCount,
  175. canEndNotMax: false,
  176. isShowOpponent: true,
  177. mode: SelectCardEffect.Mode.AddHand,
  178. root: SelectCardEffect.Root.Trash,
  179. customRootCardList: null,
  180. canLookReverseCard: true,
  181. selectPlayer: card.Owner,
  182. cardEffect: activateClass);
  183. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  184. }
  185. }
  186. #endregion
  187. return cardEffects;
  188. }
  189. }
  190. }