LM_031.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace DCGO.CardEffects.LM
  6. {
  7. public class LM_031 : CEntity_Effect
  8. {
  9. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  10. {
  11. List<ICardEffect> cardEffects = new List<ICardEffect>();
  12. #region Main Effect
  13. if (timing == EffectTiming.OptionSkill)
  14. {
  15. ActivateClass activateClass = new ActivateClass();
  16. activateClass.SetUpICardEffect("Digivolve into a black Digimon from hand with reduced cost", CanUseCondition, card);
  17. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDescription());
  18. cardEffects.Add(activateClass);
  19. string EffectDescription()
  20. {
  21. return "[Main] 1 of your black Digimon may digivolve into a black Digimon card in the hand with the digivolution cost reduced by 3. Then, place this card in the battle area.";
  22. }
  23. bool CanUseCondition(Hashtable hashtable)
  24. {
  25. return CardEffectCommons.CanTriggerOptionMainEffect(hashtable, card);
  26. }
  27. bool CanSelectHandCardCondition(CardSource cardSource)
  28. {
  29. return cardSource.IsDigimon && cardSource.HasCardColor(CardColor.Black);
  30. }
  31. bool CanSelectOwnPermanentCondition(Permanent permanent)
  32. {
  33. return CanSelectHandCardCondition(permanent.TopCard) &&
  34. CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card) &&
  35. card.Owner.HandCards.Where(CanSelectHandCardCondition).Any(cardSource => cardSource.CanPlayCardTargetFrame(permanent.PermanentFrame, false, activateClass));
  36. }
  37. IEnumerator ActivateCoroutine(Hashtable hashtable)
  38. {
  39. if (CardEffectCommons.HasMatchConditionPermanent(CanSelectOwnPermanentCondition))
  40. {
  41. Permanent selectedPermanent = null;
  42. SelectPermanentEffect selectPermanentEffect = GManager.instance.GetComponent<SelectPermanentEffect>();
  43. selectPermanentEffect.SetUp(
  44. selectPlayer: card.Owner,
  45. canTargetCondition: CanSelectOwnPermanentCondition,
  46. canTargetCondition_ByPreSelecetedList: null,
  47. canEndSelectCondition: null,
  48. maxCount: 1,
  49. canNoSelect: true,
  50. canEndNotMax: false,
  51. selectPermanentCoroutine: SelectPermanentCoroutine,
  52. afterSelectPermanentCoroutine: null,
  53. mode: SelectPermanentEffect.Mode.Custom,
  54. cardEffect: activateClass);
  55. selectPermanentEffect.SetUpCustomMessage("Select 1 black Digimon that will digivolve.", "The opponent is selecting 1 Digimon that will digivolve.");
  56. yield return ContinuousController.instance.StartCoroutine(selectPermanentEffect.Activate());
  57. IEnumerator SelectPermanentCoroutine(Permanent permanent)
  58. {
  59. selectedPermanent = permanent;
  60. yield return null;
  61. }
  62. if (selectedPermanent != null)
  63. {
  64. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.DigivolveIntoHandOrTrashCard(
  65. targetPermanent: selectedPermanent,
  66. cardCondition: CanSelectHandCardCondition,
  67. payCost: true,
  68. reduceCostTuple: (reduceCost: 3, reduceCostCardCondition: null),
  69. fixedCostTuple: null,
  70. ignoreDigivolutionRequirementFixedCost: -1,
  71. isHand: true,
  72. activateClass: activateClass,
  73. successProcess: null));
  74. }
  75. }
  76. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlaceDelayOptionCards(card: card, cardEffect: activateClass));
  77. }
  78. }
  79. #endregion
  80. #region Main Delay
  81. if (timing == EffectTiming.OnStartTurn)
  82. {
  83. ActivateClass activateClass = new ActivateClass();
  84. activateClass.SetUpICardEffect("Return a black Digimon to top of the deck from trash, then play a black Digimon from trash.", CanUseCondition, card);
  85. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, true, EffectDiscription());
  86. cardEffects.Add(activateClass);
  87. string EffectDiscription()
  88. {
  89. return "[Start of your Turn] If your opponent has a Digimon, <Delay>.\r\n Return 1 black Digimon card from your trash to the top of the deck. Then, if you don't have a Digimon, you may play 1 black Digimon card with 2000 DP or less from your trash without paying the cost.";
  90. }
  91. bool CanSelectCardCondition(CardSource cardSource)
  92. {
  93. return cardSource.IsDigimon && cardSource.HasCardColor(CardColor.Black);
  94. }
  95. bool CanSelectCardCondition1(CardSource cardSource)
  96. {
  97. if (cardSource != null)
  98. {
  99. if (cardSource.Owner == card.Owner)
  100. {
  101. if (CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass))
  102. {
  103. if (cardSource.IsDigimon)
  104. {
  105. if (cardSource.HasCardColor(CardColor.Black) && cardSource.CardDP <= 2000)
  106. {
  107. return true;
  108. }
  109. }
  110. }
  111. }
  112. }
  113. return false;
  114. }
  115. bool CanUseCondition(Hashtable hashtable)
  116. {
  117. return CardEffectCommons.IsOwnerTurn(card) &&
  118. CardEffectCommons.IsExistOnBattleArea(card) &&
  119. card.Owner.Enemy.GetBattleAreaDigimons().Count >= 1 &&
  120. CardEffectCommons.CanDeclareOptionDelayEffect(card);
  121. }
  122. IEnumerator ActivateCoroutine(Hashtable hashtable)
  123. {
  124. bool deleted = false;
  125. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.DeletePeremanentAndProcessAccordingToResult(targetPermanents: new List<Permanent>() { card.PermanentOfThisCard() }, activateClass: activateClass, successProcess: permanents => SuccessProcess(), failureProcess: null));
  126. IEnumerator SuccessProcess()
  127. {
  128. deleted = true;
  129. yield return null;
  130. }
  131. if (deleted)
  132. {
  133. if (card.Owner.TrashCards.Count(CanSelectCardCondition) >= 1)
  134. {
  135. int maxCount = 1;
  136. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  137. selectCardEffect.SetUp(
  138. canTargetCondition: (cardSource) => CanSelectCardCondition(cardSource),
  139. canTargetCondition_ByPreSelecetedList: null,
  140. canEndSelectCondition: null,
  141. canNoSelect: () => false,
  142. selectCardCoroutine: null,
  143. afterSelectCardCoroutine: AfterSelectCardCoroutine,
  144. message: "Select a black Digimon to place at the top of the deck\n(cards will be placed back to the top of the deck so that cards with lower numbers are on top).",
  145. maxCount: maxCount,
  146. canEndNotMax: false,
  147. isShowOpponent: true,
  148. mode: SelectCardEffect.Mode.Custom,
  149. root: SelectCardEffect.Root.Trash,
  150. customRootCardList: null,
  151. canLookReverseCard: true,
  152. selectPlayer: card.Owner,
  153. cardEffect: activateClass);
  154. selectCardEffect.SetNotAddLog();
  155. selectCardEffect.SetUpCustomMessage_ShowCard("Deck Top Cards");
  156. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  157. IEnumerator AfterSelectCardCoroutine(List<CardSource> cardSources)
  158. {
  159. if (cardSources.Count == 1)
  160. {
  161. yield return ContinuousController.instance.StartCoroutine(CardObjectController.AddLibraryTopCards(cardSources));
  162. }
  163. }
  164. }
  165. if (card.Owner.GetBattleAreaDigimons().Count == 0)
  166. {
  167. if (CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, (cardSource) => CanSelectCardCondition1(cardSource)))
  168. {
  169. int maxCount = Math.Min(1, card.Owner.TrashCards.Count((cardSource) => CanSelectCardCondition1(cardSource)));
  170. List<CardSource> selectedCards = new List<CardSource>();
  171. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  172. selectCardEffect.SetUp(
  173. canTargetCondition: CanSelectCardCondition1,
  174. canTargetCondition_ByPreSelecetedList: null,
  175. canEndSelectCondition: null,
  176. canNoSelect: () => true,
  177. selectCardCoroutine: SelectCardCoroutine,
  178. afterSelectCardCoroutine: null,
  179. message: "Select 1 black Digimon with 2000 DP or less to play.",
  180. maxCount: maxCount,
  181. canEndNotMax: false,
  182. isShowOpponent: true,
  183. mode: SelectCardEffect.Mode.Custom,
  184. root: SelectCardEffect.Root.Trash,
  185. customRootCardList: null,
  186. canLookReverseCard: true,
  187. selectPlayer: card.Owner,
  188. cardEffect: activateClass);
  189. selectCardEffect.SetUpCustomMessage("Select 1 black Digimon with 2000 DP or less to play.", "The opponent is selecting 1 card to play.");
  190. selectCardEffect.SetUpCustomMessage_ShowCard("Played Card");
  191. yield return StartCoroutine(selectCardEffect.Activate());
  192. IEnumerator SelectCardCoroutine(CardSource cardSource)
  193. {
  194. selectedCards.Add(cardSource);
  195. yield return null;
  196. }
  197. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(cardSources: selectedCards, activateClass: activateClass, payCost: false, isTapped: false, root: SelectCardEffect.Root.Trash, activateETB: true));
  198. }
  199. }
  200. }
  201. }
  202. }
  203. #endregion
  204. #region Security
  205. if (timing == EffectTiming.SecuritySkill)
  206. {
  207. ActivateClass activateClass = new ActivateClass();
  208. activateClass.SetUpICardEffect($"Play a black Digimon from trash.", CanUseCondition, card);
  209. activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, false, EffectDiscription());
  210. activateClass.SetIsSecurityEffect(true);
  211. cardEffects.Add(activateClass);
  212. string EffectDiscription()
  213. {
  214. return "[Security] You may play 1 black Digimon card with 2000 DP or less from your trash without paying the cost. Then, add this card to the hand.";
  215. }
  216. bool CanSelectCardCondition(CardSource cardSource)
  217. {
  218. if (cardSource != null)
  219. {
  220. if (cardSource.Owner == card.Owner)
  221. {
  222. if (CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass))
  223. {
  224. if (cardSource.IsDigimon)
  225. {
  226. if (cardSource.HasCardColor(CardColor.Black) && cardSource.CardDP <= 2000)
  227. {
  228. return true;
  229. }
  230. }
  231. }
  232. }
  233. }
  234. return false;
  235. }
  236. bool CanUseCondition(Hashtable hashtable)
  237. {
  238. return CardEffectCommons.CanTriggerSecurityEffect(hashtable, card);
  239. }
  240. IEnumerator ActivateCoroutine(Hashtable _hashtable)
  241. {
  242. if (CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, (cardSource) => CanSelectCardCondition(cardSource)))
  243. {
  244. int maxCount = Math.Min(1, card.Owner.TrashCards.Count((cardSource) => CanSelectCardCondition(cardSource)));
  245. List<CardSource> selectedCards = new List<CardSource>();
  246. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  247. selectCardEffect.SetUp(
  248. canTargetCondition: CanSelectCardCondition,
  249. canTargetCondition_ByPreSelecetedList: null,
  250. canEndSelectCondition: null,
  251. canNoSelect: () => true,
  252. selectCardCoroutine: SelectCardCoroutine,
  253. afterSelectCardCoroutine: null,
  254. message: "Select 1 black Digimon with 2000 DP or less to play.",
  255. maxCount: maxCount,
  256. canEndNotMax: false,
  257. isShowOpponent: true,
  258. mode: SelectCardEffect.Mode.Custom,
  259. root: SelectCardEffect.Root.Trash,
  260. customRootCardList: null,
  261. canLookReverseCard: true,
  262. selectPlayer: card.Owner,
  263. cardEffect: activateClass);
  264. selectCardEffect.SetUpCustomMessage("Select 1 black Digimon with 2000 DP or less to play.", "The opponent is selecting 1 card to play.");
  265. selectCardEffect.SetUpCustomMessage_ShowCard("Played Card");
  266. yield return StartCoroutine(selectCardEffect.Activate());
  267. IEnumerator SelectCardCoroutine(CardSource cardSource)
  268. {
  269. selectedCards.Add(cardSource);
  270. yield return null;
  271. }
  272. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(cardSources: selectedCards, activateClass: activateClass, payCost: false, isTapped: false, root: SelectCardEffect.Root.Trash, activateETB: true));
  273. }
  274. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.AddThisCardToHand(card, activateClass));
  275. }
  276. }
  277. #endregion
  278. return cardEffects;
  279. }
  280. }
  281. }