BT19_094.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. using Photon.Pun;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using UnityEngine;
  7. namespace DCGO.CardEffects.BT19
  8. {
  9. public class BT19_094 : CEntity_Effect
  10. {
  11. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  12. {
  13. List<ICardEffect> cardEffects = new List<ICardEffect>();
  14. #region Trash
  15. if (timing == EffectTiming.OnEnterFieldAnyone)
  16. {
  17. ActivateClass activateClass = new ActivateClass();
  18. activateClass.SetUpICardEffect("Trash opponents top security card or Recovery +1", CanUseCondition, card);
  19. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, true, EffectDiscription());
  20. cardEffects.Add(activateClass);
  21. string EffectDiscription()
  22. {
  23. return "[Trash][Your Turn] When any of your Digimon digivolve into [Lucemon (X Antibody)], by returning this card to the bottom of the deck, your opponent may trash their top security card. If this effect didn't trash, <Recovery +1>";
  24. }
  25. bool PermanentCondition(Permanent permanent)
  26. {
  27. if (CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card))
  28. {
  29. if (permanent.TopCard.EqualsCardName("Lucemon (X Antibody)"))
  30. {
  31. return true;
  32. }
  33. }
  34. return false;
  35. }
  36. bool CanUseCondition(Hashtable hashtable)
  37. {
  38. if (CardEffectCommons.IsExistOnTrash(card))
  39. {
  40. if (CardEffectCommons.CanTriggerWhenPermanentDigivolving(hashtable, PermanentCondition))
  41. {
  42. if (CardEffectCommons.IsOwnerTurn(card))
  43. {
  44. return true;
  45. }
  46. }
  47. }
  48. return false;
  49. }
  50. IEnumerator ActivateCoroutine(Hashtable _hashtable)
  51. {
  52. if (CardEffectCommons.IsExistOnTrash(card))
  53. {
  54. List<CardSource> cardSources = new List<CardSource>() { card };
  55. yield return ContinuousController.instance.StartCoroutine(CardObjectController.AddLibraryBottomCards(cardSources));
  56. yield return ContinuousController.instance.StartCoroutine(GManager.instance.GetComponent<Effects>().ShowCardEffect2(cardSources, "Deck Bottom Card", true, true));
  57. if (card.Owner.Enemy.SecurityCards.Count > 0)
  58. {
  59. List<SelectionElement<bool>> selectionElements = new List<SelectionElement<bool>>()
  60. {
  61. new SelectionElement<bool>(message: $"Discard", value : true, spriteIndex: 0),
  62. new SelectionElement<bool>(message: $"Not Discard", value : false, spriteIndex: 1),
  63. };
  64. string selectPlayerMessage = "Will you discard the top card of your security?";
  65. string notSelectPlayerMessage = "The opponent is choosing whether to discard security.";
  66. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements, selectPlayer: card.Owner.Enemy, selectPlayerMessage: selectPlayerMessage, notSelectPlayerMessage: notSelectPlayerMessage);
  67. }
  68. else
  69. {
  70. GManager.instance.userSelectionManager.SetBool(false);
  71. }
  72. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager.WaitForEndSelect());
  73. bool doDiscard = GManager.instance.userSelectionManager.SelectedBoolValue;
  74. if (!doDiscard)
  75. {
  76. yield return ContinuousController.instance.StartCoroutine(new IRecovery(card.Owner, 1, activateClass).Recovery());
  77. }
  78. else
  79. {
  80. yield return ContinuousController.instance.StartCoroutine(new IDestroySecurity(
  81. player: card.Owner.Enemy,
  82. destroySecurityCount: 1,
  83. cardEffect: activateClass,
  84. fromTop: true).DestroySecurity());
  85. }
  86. }
  87. }
  88. }
  89. #endregion
  90. #region Main
  91. if (timing == EffectTiming.OptionSkill)
  92. {
  93. ActivateClass activateClass = new ActivateClass();
  94. activateClass.SetUpICardEffect(card.BaseENGCardNameFromEntity, CanUseCondition, card);
  95. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDiscription());
  96. cardEffects.Add(activateClass);
  97. string EffectDiscription()
  98. {
  99. return "[Main] Delete your opponent's Digimon until they have as many as the number of your security cards. If this effect deleted, <Recovery +1>.";
  100. }
  101. bool CanSelectPermanentCondition(Permanent permanent)
  102. {
  103. return CardEffectCommons.IsPermanentExistsOnOpponentBattleAreaDigimon(permanent, card);
  104. }
  105. bool CanUseCondition(Hashtable hashtable)
  106. {
  107. return CardEffectCommons.CanTriggerOptionMainEffect(hashtable, card) &&
  108. card.Owner.Enemy.GetBattleAreaDigimons().Count > card.Owner.SecurityCards.Count;
  109. }
  110. IEnumerator ActivateCoroutine(Hashtable _hashtable)
  111. {
  112. if (CardEffectCommons.HasMatchConditionPermanent(CanSelectPermanentCondition))
  113. {
  114. int maxCount = Mathf.Max(0, card.Owner.Enemy.GetBattleAreaDigimons().Count - card.Owner.SecurityCards.Count);
  115. SelectPermanentEffect selectPermanentEffect = GManager.instance.GetComponent<SelectPermanentEffect>();
  116. selectPermanentEffect.SetUp(
  117. selectPlayer: card.Owner,
  118. canTargetCondition: CanSelectPermanentCondition,
  119. canTargetCondition_ByPreSelecetedList: null,
  120. canEndSelectCondition: null,
  121. maxCount: maxCount,
  122. canNoSelect: false,
  123. canEndNotMax: false,
  124. selectPermanentCoroutine: null,
  125. afterSelectPermanentCoroutine: SelectPermanentCoroutine,
  126. mode: SelectPermanentEffect.Mode.Custom,
  127. cardEffect: activateClass);
  128. selectPermanentEffect.SetUpCustomMessage("Select which Digimon(s) to delete.", "The opponent is selecting which Digimon(s) to delete.");
  129. yield return ContinuousController.instance.StartCoroutine(selectPermanentEffect.Activate());
  130. IEnumerator SelectPermanentCoroutine(List<Permanent> permanents)
  131. {
  132. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.DeletePeremanentAndProcessAccordingToResult(targetPermanents: permanents, activateClass: activateClass, successProcess: permanents => SuccessProcess(), failureProcess: null));
  133. IEnumerator SuccessProcess()
  134. {
  135. yield return ContinuousController.instance.StartCoroutine(new IRecovery(card.Owner, 1, activateClass).Recovery());
  136. }
  137. }
  138. }
  139. }
  140. }
  141. #endregion
  142. #region Security
  143. if (timing == EffectTiming.SecuritySkill)
  144. {
  145. ActivateClass activateClass = new ActivateClass();
  146. activateClass.SetUpICardEffect("Play 1 Digimon from trash", CanUseCondition, card);
  147. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, true, EffectDiscription());
  148. activateClass.SetIsSecurityEffect(true);
  149. cardEffects.Add(activateClass);
  150. string EffectDiscription()
  151. {
  152. return "[Security] You may play 1 [Lucemon] from your trash without paying the cost.";
  153. }
  154. bool CanSelectCardCondition(CardSource cardSource)
  155. {
  156. if (cardSource != null)
  157. {
  158. if (cardSource.Owner == card.Owner)
  159. {
  160. if (CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass))
  161. {
  162. if (cardSource.EqualsCardName("Lucemon"))
  163. {
  164. return true;
  165. }
  166. }
  167. }
  168. }
  169. return false;
  170. }
  171. bool CanUseCondition(Hashtable hashtable)
  172. {
  173. return CardEffectCommons.CanTriggerSecurityEffect(hashtable, card);
  174. }
  175. IEnumerator ActivateCoroutine(Hashtable _hashtable)
  176. {
  177. if (CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, (cardSource) => CanSelectCardCondition(cardSource)))
  178. {
  179. int maxCount = Math.Min(1, card.Owner.TrashCards.Count((cardSource) => CanSelectCardCondition(cardSource)));
  180. List<CardSource> selectedCards = new List<CardSource>();
  181. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  182. selectCardEffect.SetUp(
  183. canTargetCondition: CanSelectCardCondition,
  184. canTargetCondition_ByPreSelecetedList: null,
  185. canEndSelectCondition: null,
  186. canNoSelect: () => true,
  187. selectCardCoroutine: SelectCardCoroutine,
  188. afterSelectCardCoroutine: null,
  189. message: "Select 1 card to play.",
  190. maxCount: maxCount,
  191. canEndNotMax: false,
  192. isShowOpponent: true,
  193. mode: SelectCardEffect.Mode.Custom,
  194. root: SelectCardEffect.Root.Trash,
  195. customRootCardList: null,
  196. canLookReverseCard: true,
  197. selectPlayer: card.Owner,
  198. cardEffect: activateClass);
  199. selectCardEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  200. selectCardEffect.SetUpCustomMessage_ShowCard("Played Card");
  201. yield return StartCoroutine(selectCardEffect.Activate());
  202. IEnumerator SelectCardCoroutine(CardSource cardSource)
  203. {
  204. selectedCards.Add(cardSource);
  205. yield return null;
  206. }
  207. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(cardSources: selectedCards, activateClass: activateClass, payCost: false, isTapped: false, root: SelectCardEffect.Root.Trash, activateETB: true));
  208. }
  209. }
  210. }
  211. #endregion
  212. return cardEffects;
  213. }
  214. }
  215. }