BT20_095.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace DCGO.CardEffects.BT20
  5. {
  6. public class BT20_095 : CEntity_Effect
  7. {
  8. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  9. {
  10. List<ICardEffect> cardEffects = new List<ICardEffect>();
  11. #region Main Effect
  12. if (timing == EffectTiming.OptionSkill)
  13. {
  14. ActivateClass activateClass = new ActivateClass();
  15. activateClass.SetUpICardEffect(card.BaseENGCardNameFromEntity, CanUseCondition, card);
  16. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDescription());
  17. cardEffects.Add(activateClass);
  18. string EffectDescription()
  19. {
  20. return
  21. "[Main] Reveal the top 3 cards of your deck. Add 1 [Chronicle] trait card among them to the hand. Return the rest to the top or bottom of the deck. Then, place this card in the battle area.";
  22. }
  23. bool CanSelectChronicleCondition(CardSource cardSource)
  24. {
  25. return cardSource.ContainsTraits("Chronicle");
  26. }
  27. bool CanUseCondition(Hashtable hashtable)
  28. {
  29. return CardEffectCommons.CanTriggerOptionMainEffect(hashtable, card);
  30. }
  31. IEnumerator ActivateCoroutine(Hashtable hashtable)
  32. {
  33. yield return ContinuousController.instance.StartCoroutine(
  34. CardEffectCommons.SimplifiedRevealDeckTopCardsAndSelect(
  35. revealCount: 3,
  36. simplifiedSelectCardConditions:
  37. new SimplifiedSelectCardConditionClass[]
  38. {
  39. new(
  40. canTargetCondition: CanSelectChronicleCondition,
  41. message: "Select 1 card with the [Chronicle] trait.",
  42. mode: SelectCardEffect.Mode.AddHand,
  43. maxCount: 1,
  44. selectCardCoroutine: null)
  45. },
  46. remainingCardsPlace: RemainingCardsPlace.DeckTopOrBottom,
  47. activateClass: activateClass
  48. ));
  49. yield return ContinuousController.instance.StartCoroutine(
  50. CardEffectCommons.PlaceDelayOptionCards(card: card, cardEffect: activateClass));
  51. }
  52. }
  53. #endregion
  54. #region Delay
  55. if (timing == EffectTiming.OnDestroyedAnyone)
  56. {
  57. ActivateClass activateClass = new ActivateClass();
  58. activateClass.SetUpICardEffect("Move 1 Digimon", CanUseCondition, card);
  59. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, true, EffectDescription());
  60. cardEffects.Add(activateClass);
  61. string EffectDescription()
  62. {
  63. return
  64. "[All Turns] When any of your [Chronicle] trait Digimon are deleted, <Delay>.\n・By moving your level 3 or higher Digimon from the breeding area to the battle area, it may digivolve into a [Chronicle] trait Digimon card in the hand or trash without paying the cost.";
  65. }
  66. bool PermanentCondition(Permanent permanent)
  67. {
  68. return CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card) &&
  69. permanent.TopCard.ContainsTraits("Chronicle");
  70. }
  71. bool BreedingAreaPermanentCondition(Permanent permanent)
  72. {
  73. return permanent.IsDigimon &&
  74. permanent.TopCard.HasLevel && permanent.Level >= 3 &&
  75. permanent.CanMove;
  76. }
  77. bool CanUseCondition(Hashtable hashtable)
  78. {
  79. return CardEffectCommons.CanDeclareOptionDelayEffect(card) &&
  80. CardEffectCommons.CanTriggerOnPermanentDeleted(hashtable, PermanentCondition, activateClass);
  81. }
  82. IEnumerator ActivateCoroutine(Hashtable hashtable)
  83. {
  84. yield return ContinuousController.instance.StartCoroutine(
  85. CardEffectCommons.DeletePeremanentAndProcessAccordingToResult(
  86. targetPermanents: new List<Permanent>() { card.PermanentOfThisCard() },
  87. activateClass: activateClass, successProcess: _ => SuccessProcess(),
  88. failureProcess: null));
  89. }
  90. IEnumerator SuccessProcess()
  91. {
  92. if (card.Owner.GetBreedingAreaPermanents().Count(BreedingAreaPermanentCondition) >= 1 &&
  93. card.Owner.fieldCardFrames.Count(frame => frame.IsEmptyFrame()) >= 1)
  94. {
  95. Permanent selectedPermanent = card.Owner.GetBreedingAreaPermanents()[0];
  96. yield return ContinuousController.instance.StartCoroutine(
  97. CardObjectController.MovePermanent(selectedPermanent.PermanentFrame));
  98. bool CanSelectDigivolveCardCondition(CardSource cardSource)
  99. {
  100. return cardSource.EqualsTraits("Chronicle") &&
  101. cardSource.CanPlayCardTargetFrame(
  102. selectedPermanent.PermanentFrame, false, activateClass);
  103. }
  104. bool canSelectHand = CardEffectCommons.HasMatchConditionOwnersHand(card, CanSelectDigivolveCardCondition);
  105. bool canSelectTrash = CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, CanSelectDigivolveCardCondition);
  106. if (canSelectHand || canSelectTrash)
  107. {
  108. List<SelectionElement<bool>> selectionElements = new List<SelectionElement<bool>>()
  109. {
  110. new(message: "Digivolve", value: true, spriteIndex: 0),
  111. new(message: "Do not digivolve", value: false, spriteIndex: 1),
  112. };
  113. string selectPlayerMessage = "Digivolve?";
  114. string notSelectPlayerMessage = "The opponent is choosing whether to digivolve.";
  115. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements,
  116. selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage,
  117. notSelectPlayerMessage: notSelectPlayerMessage);
  118. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager
  119. .WaitForEndSelect());
  120. if (GManager.instance.userSelectionManager.SelectedBoolValue)
  121. {
  122. if (canSelectHand && canSelectTrash)
  123. {
  124. selectionElements = new List<SelectionElement<bool>>()
  125. {
  126. new(message: "From hand", value: true, spriteIndex: 0),
  127. new(message: "From trash", value: false, spriteIndex: 1),
  128. };
  129. selectPlayerMessage = "From which area do you play a card?";
  130. notSelectPlayerMessage = "The opponent is choosing from which area to play a card.";
  131. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements,
  132. selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage,
  133. notSelectPlayerMessage: notSelectPlayerMessage);
  134. }
  135. else
  136. {
  137. GManager.instance.userSelectionManager.SetBool(canSelectHand);
  138. }
  139. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager
  140. .WaitForEndSelect());
  141. yield return ContinuousController.instance.StartCoroutine(
  142. CardEffectCommons.DigivolveIntoHandOrTrashCard(
  143. targetPermanent: selectedPermanent,
  144. cardCondition: CanSelectDigivolveCardCondition,
  145. payCost: false,
  146. reduceCostTuple: null,
  147. fixedCostTuple: null,
  148. ignoreDigivolutionRequirementFixedCost: -1,
  149. isHand: GManager.instance.userSelectionManager.SelectedBoolValue,
  150. activateClass: activateClass,
  151. successProcess: null));
  152. }
  153. }
  154. }
  155. }
  156. }
  157. #endregion
  158. #region Security Effect
  159. if (timing == EffectTiming.SecuritySkill)
  160. {
  161. ActivateClass activateClass = new ActivateClass();
  162. activateClass.SetUpICardEffect("Play 1 [Chronicle] trait card from hand or trash", CanUseCondition, card);
  163. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDescription());
  164. activateClass.SetIsSecurityEffect(true);
  165. cardEffects.Add(activateClass);
  166. string EffectDescription()
  167. {
  168. return
  169. "[Security] You may play 1 [Chronicle] trait card with a play cost of 5 or less from your hand or trash without paying the cost. Then, place this card in the battle area.";
  170. }
  171. bool CanUseCondition(Hashtable hashtable)
  172. {
  173. return CardEffectCommons.CanTriggerSecurityEffect(hashtable, card);
  174. }
  175. bool CanSelectCardCondition(CardSource cardSource)
  176. {
  177. return cardSource.ContainsTraits("Chronicle") &&
  178. cardSource.HasPlayCost && cardSource.GetCostItself <= 5 &&
  179. !cardSource.IsDigiEgg &&
  180. CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass);
  181. }
  182. IEnumerator ActivateCoroutine(Hashtable hashtable)
  183. {
  184. bool canSelectHand = CardEffectCommons.HasMatchConditionOwnersHand(card, CanSelectCardCondition);
  185. bool canSelectTrash = CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, CanSelectCardCondition);
  186. if (canSelectHand || canSelectTrash)
  187. {
  188. if (canSelectHand && canSelectTrash)
  189. {
  190. List<SelectionElement<bool>> selectionElements = new List<SelectionElement<bool>>
  191. {
  192. new(message: "From hand", value: true, spriteIndex: 0),
  193. new(message: "From trash", value: false, spriteIndex: 1),
  194. };
  195. string selectPlayerMessage = "From which area do you play a card?";
  196. string notSelectPlayerMessage = "The opponent is choosing from which area to play a card.";
  197. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements,
  198. selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage,
  199. notSelectPlayerMessage: notSelectPlayerMessage);
  200. }
  201. else
  202. {
  203. GManager.instance.userSelectionManager.SetBool(canSelectHand);
  204. }
  205. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager
  206. .WaitForEndSelect());
  207. bool fromHand = GManager.instance.userSelectionManager.SelectedBoolValue;
  208. List<CardSource> selectedCards = new List<CardSource>();
  209. IEnumerator SelectCardCoroutine(CardSource cardSource)
  210. {
  211. selectedCards.Add(cardSource);
  212. yield return null;
  213. }
  214. if (fromHand)
  215. {
  216. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  217. selectHandEffect.SetUp(
  218. selectPlayer: card.Owner,
  219. canTargetCondition: CanSelectCardCondition,
  220. canTargetCondition_ByPreSelecetedList: null,
  221. canEndSelectCondition: null,
  222. maxCount: 1,
  223. canNoSelect: true,
  224. canEndNotMax: false,
  225. isShowOpponent: true,
  226. selectCardCoroutine: SelectCardCoroutine,
  227. afterSelectCardCoroutine: null,
  228. mode: SelectHandEffect.Mode.Custom,
  229. cardEffect: activateClass);
  230. selectHandEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  231. selectHandEffect.SetUpCustomMessage_ShowCard("Played Card");
  232. yield return StartCoroutine(selectHandEffect.Activate());
  233. }
  234. else
  235. {
  236. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  237. selectCardEffect.SetUp(
  238. canTargetCondition: CanSelectCardCondition,
  239. canTargetCondition_ByPreSelecetedList: null,
  240. canEndSelectCondition: null,
  241. canNoSelect: () => true,
  242. selectCardCoroutine: SelectCardCoroutine,
  243. afterSelectCardCoroutine: null,
  244. message: "Select 1 card to play.",
  245. maxCount: 1,
  246. canEndNotMax: false,
  247. isShowOpponent: true,
  248. mode: SelectCardEffect.Mode.Custom,
  249. root: SelectCardEffect.Root.Trash,
  250. customRootCardList: null,
  251. canLookReverseCard: true,
  252. selectPlayer: card.Owner,
  253. cardEffect: activateClass);
  254. selectCardEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  255. selectCardEffect.SetUpCustomMessage_ShowCard("Played Card");
  256. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  257. }
  258. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(
  259. cardSources: selectedCards, activateClass: activateClass, payCost: false, isTapped: false,
  260. root: fromHand ? SelectCardEffect.Root.Hand : SelectCardEffect.Root.Trash, activateETB: true));
  261. }
  262. yield return ContinuousController.instance.StartCoroutine(
  263. CardEffectCommons.PlaceDelayOptionCards(card: card, cardEffect: activateClass));
  264. }
  265. }
  266. #endregion
  267. return cardEffects;
  268. }
  269. }
  270. }