EX11_034.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. // QueenBeemon
  6. namespace DCGO.CardEffects.EX11
  7. {
  8. public class EX11_034 : CEntity_Effect
  9. {
  10. public override List<ICardEffect> CardEffects(EffectTiming timing, CardSource card)
  11. {
  12. List<ICardEffect> cardEffects = new List<ICardEffect>();
  13. #region Alternate Digivolution
  14. if (timing == EffectTiming.None)
  15. {
  16. bool PermanentCondition(Permanent targetPermanent)
  17. {
  18. return targetPermanent.TopCard.IsLevel5
  19. && targetPermanent.TopCard.EqualsTraits("Royal Base");
  20. }
  21. cardEffects.Add(CardEffectFactory.AddSelfDigivolutionRequirementStaticEffect(
  22. permanentCondition: PermanentCondition, digivolutionCost: 3, ignoreDigivolutionRequirement: false,
  23. card: card, condition: null));
  24. }
  25. #endregion
  26. #region Shared OP/WD/WA
  27. string SharedEffectName()
  28. {
  29. return "May place [Royal Base] trait card from hand or trash face up at top or bot of sec, then delete opponent's Digimon";
  30. }
  31. string SharedEffectDescription(string tag)
  32. {
  33. return $"[{tag}] [Once Per Turn] You may place 1 [Royal Base] trait card from your hand or trash face up as the top or bottom security card. Then, delete up to 8 play cost's total worth of your opponent's Digimon. For each of your face-up security cards, add 2 to this effect's play cost maximum.";
  34. }
  35. string SharedHashString = "EX11_034_OP_WD_WA";
  36. bool SharedCanActivateCondition(Hashtable hashtable)
  37. {
  38. return CardEffectCommons.IsExistOnBattleArea(card);
  39. }
  40. bool CanSelectCardCondition(CardSource cardSource)
  41. {
  42. return cardSource.EqualsTraits("Royal Base");
  43. }
  44. int maxCost()
  45. {
  46. int maxCost = 8;
  47. if (CardEffectCommons.IsExistOnBattleArea(card))
  48. {
  49. maxCost += 2 * card.Owner.SecurityCards.Count(source => !source.IsFlipped);
  50. }
  51. return maxCost;
  52. }
  53. bool CanSelectPermanentCondition(Permanent permanent)
  54. {
  55. return CardEffectCommons.IsPermanentExistsOnOpponentBattleArea(permanent, card)
  56. && permanent.IsDigimon
  57. && permanent.TopCard.HasPlayCost
  58. && permanent.TopCard.GetCostItself <= maxCost();
  59. }
  60. IEnumerator SharedActivateCoroutine(Hashtable hashtable, ActivateClass activateClass)
  61. {
  62. if (card.Owner.CanAddSecurity(activateClass))
  63. {
  64. #region Setup Location Selection
  65. bool canSelectHand = CardEffectCommons.HasMatchConditionOwnersHand(card, cardSource => CanSelectCardCondition(cardSource));
  66. bool canSelectTrash = CardEffectCommons.HasMatchConditionOwnersCardInTrash(card, cardSource => CanSelectCardCondition(cardSource));
  67. List<SelectionElement<int>> selectionElements = new List<SelectionElement<int>>();
  68. if (canSelectHand)
  69. {
  70. selectionElements.Add(new(message: "From hand", value: 0, spriteIndex: 0));
  71. }
  72. if (canSelectTrash)
  73. {
  74. selectionElements.Add(new(message: "From trash", value: 1, spriteIndex: 0));
  75. }
  76. selectionElements.Add(new(message: "Do not place", value: 2, spriteIndex: 1));
  77. string selectPlayerMessage = "From which area will you select?";
  78. string notSelectPlayerMessage = "The opponent is choosing if they will activate their effect.";
  79. GManager.instance.userSelectionManager.SetIntSelection(selectionElements: selectionElements,
  80. selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage,
  81. notSelectPlayerMessage: notSelectPlayerMessage);
  82. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager
  83. .WaitForEndSelect());
  84. int selection = GManager.instance.userSelectionManager.SelectedIntValue;
  85. #endregion
  86. #region Hand/Trash Card Selection
  87. if (selection != 2)
  88. {
  89. CardSource selectedCard = null;
  90. IEnumerator SelectCardCoroutine(CardSource cardSource)
  91. {
  92. selectedCard = cardSource;
  93. yield return null;
  94. }
  95. if (selection == 0)
  96. {
  97. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  98. selectHandEffect.SetUp(
  99. selectPlayer: card.Owner,
  100. canTargetCondition: cardSource => CanSelectCardCondition(cardSource),
  101. canTargetCondition_ByPreSelecetedList: null,
  102. canEndSelectCondition: null,
  103. maxCount: 1,
  104. canNoSelect: true,
  105. canEndNotMax: false,
  106. isShowOpponent: true,
  107. selectCardCoroutine: SelectCardCoroutine,
  108. afterSelectCardCoroutine: null,
  109. mode: SelectHandEffect.Mode.Custom,
  110. cardEffect: activateClass);
  111. selectHandEffect.SetUpCustomMessage("Select 1 card to place.", "The opponent is selecting 1 card to place.");
  112. yield return ContinuousController.instance.StartCoroutine(selectHandEffect.Activate());
  113. }
  114. else
  115. {
  116. SelectCardEffect selectCardEffect = GManager.instance.GetComponent<SelectCardEffect>();
  117. selectCardEffect.SetUp(
  118. canTargetCondition: cardSource => CanSelectCardCondition(cardSource),
  119. canTargetCondition_ByPreSelecetedList: null,
  120. canEndSelectCondition: null,
  121. canNoSelect: () => true,
  122. selectCardCoroutine: SelectCardCoroutine,
  123. afterSelectCardCoroutine: null,
  124. message: "Select 1 card to place.",
  125. maxCount: 1,
  126. canEndNotMax: false,
  127. isShowOpponent: true,
  128. mode: SelectCardEffect.Mode.Custom,
  129. root: SelectCardEffect.Root.Trash,
  130. customRootCardList: null,
  131. canLookReverseCard: true,
  132. selectPlayer: card.Owner,
  133. cardEffect: activateClass);
  134. selectCardEffect.SetUpCustomMessage("Select 1 card to place.", "The opponent is selecting 1 card to place.");
  135. yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate());
  136. }
  137. #endregion
  138. #region Top/Bottom Selection
  139. yield return ContinuousController.instance.StartCoroutine(GManager.instance.GetComponent<Effects>().ShowCardEffect(new List<CardSource>() { selectedCard }, "Security Top card", true, true));
  140. List<SelectionElement<bool>> selectionElements1 = new List<SelectionElement<bool>>()
  141. {
  142. new SelectionElement<bool>(message: $"Security Top", value : true, spriteIndex: 0),
  143. new SelectionElement<bool>(message: $"Security Bottom", value : false, spriteIndex: 1),
  144. };
  145. string selectPlayerMessage1 = "Do you place the card on the top or bottom of the security?";
  146. string notSelectPlayerMessage1 = "The opponent is choosing whether to place the card on the top or bottom of security.";
  147. GManager.instance.userSelectionManager.SetBoolSelection(selectionElements: selectionElements1, selectPlayer: card.Owner, selectPlayerMessage: selectPlayerMessage1, notSelectPlayerMessage: notSelectPlayerMessage1);
  148. yield return ContinuousController.instance.StartCoroutine(GManager.instance.userSelectionManager.WaitForEndSelect());
  149. bool toTop = GManager.instance.userSelectionManager.SelectedBoolValue;
  150. #endregion
  151. #region Send to Security
  152. yield return ContinuousController.instance.StartCoroutine(CardObjectController.AddSecurityCard(selectedCard, toTop: toTop, faceUp: true));
  153. #endregion
  154. }
  155. }
  156. #region Delete Opponent's Digimon
  157. int _maxCost = maxCost();
  158. List<Permanent> selectedPermanents = new List<Permanent>();
  159. int maxCount = card.Owner.Enemy.GetBattleAreaPermanents().Count(CanSelectPermanentCondition);
  160. SelectPermanentEffect selectPermanentEffect = GManager.instance.GetComponent<SelectPermanentEffect>();
  161. selectPermanentEffect.SetUp(
  162. selectPlayer: card.Owner,
  163. canTargetCondition: CanSelectPermanentCondition,
  164. canTargetCondition_ByPreSelecetedList: CanTargetCondition_ByPreSelecetedList,
  165. canEndSelectCondition: CanEndSelectCondition,
  166. maxCount: maxCount,
  167. canNoSelect: false,
  168. canEndNotMax: true,
  169. selectPermanentCoroutine: null,
  170. afterSelectPermanentCoroutine: null,
  171. mode: SelectPermanentEffect.Mode.Destroy,
  172. cardEffect: activateClass);
  173. yield return ContinuousController.instance.StartCoroutine(selectPermanentEffect.Activate());
  174. bool CanEndSelectCondition(List<Permanent> permanents)
  175. {
  176. if (permanents.Count <= 0)
  177. {
  178. return false;
  179. }
  180. int sumCost = 0;
  181. foreach (Permanent permanent1 in permanents)
  182. {
  183. sumCost += permanent1.TopCard.GetCostItself;
  184. }
  185. if (sumCost > _maxCost)
  186. {
  187. return false;
  188. }
  189. return true;
  190. }
  191. bool CanTargetCondition_ByPreSelecetedList(List<Permanent> permanents, Permanent permanent)
  192. {
  193. int sumCost = 0;
  194. foreach (Permanent permanent1 in permanents)
  195. {
  196. sumCost += permanent1.TopCard.GetCostItself;
  197. }
  198. sumCost += permanent.TopCard.GetCostItself;
  199. if (sumCost > _maxCost)
  200. {
  201. return false;
  202. }
  203. return true;
  204. }
  205. #endregion
  206. }
  207. #endregion
  208. #region On Play
  209. if (timing == EffectTiming.OnEnterFieldAnyone)
  210. {
  211. ActivateClass activateClass = new ActivateClass();
  212. activateClass.SetUpICardEffect(SharedEffectName(), CanUseCondition, card);
  213. activateClass.SetUpActivateClass(SharedCanActivateCondition, (hash) => SharedActivateCoroutine(hash, activateClass), 1, false, SharedEffectDescription("On Play"));
  214. activateClass.SetHashString(SharedHashString);
  215. cardEffects.Add(activateClass);
  216. bool CanUseCondition(Hashtable hashtable)
  217. {
  218. return CardEffectCommons.CanTriggerOnPlay(hashtable, card)
  219. && CardEffectCommons.IsExistOnBattleArea(card);
  220. }
  221. }
  222. #endregion
  223. #region When Digivolving
  224. if (timing == EffectTiming.OnEnterFieldAnyone)
  225. {
  226. ActivateClass activateClass = new ActivateClass();
  227. activateClass.SetUpICardEffect(SharedEffectName(), CanUseCondition, card);
  228. activateClass.SetUpActivateClass(SharedCanActivateCondition, (hash) => SharedActivateCoroutine(hash, activateClass), 1, false, SharedEffectDescription("When Digivolving"));
  229. activateClass.SetHashString(SharedHashString);
  230. cardEffects.Add(activateClass);
  231. bool CanUseCondition(Hashtable hashtable)
  232. {
  233. return CardEffectCommons.CanTriggerWhenDigivolving(hashtable, card)
  234. && CardEffectCommons.IsExistOnBattleArea(card);
  235. }
  236. }
  237. #endregion
  238. #region When Attacking
  239. if (timing == EffectTiming.OnAllyAttack)
  240. {
  241. ActivateClass activateClass = new ActivateClass();
  242. activateClass.SetUpICardEffect(SharedEffectName(), CanUseCondition, card);
  243. activateClass.SetUpActivateClass(SharedCanActivateCondition, hash => SharedActivateCoroutine(hash, activateClass), 1, false, SharedEffectDescription("When Attacking"));
  244. activateClass.SetHashString(SharedHashString);
  245. cardEffects.Add(activateClass);
  246. bool CanUseCondition(Hashtable hashtable)
  247. {
  248. return CardEffectCommons.CanTriggerOnAttack(hashtable, card) &&
  249. CardEffectCommons.IsExistOnBattleArea(card);
  250. }
  251. }
  252. #endregion
  253. #region Shared1 WD/WA
  254. string SharedHashString1 = "EX11_034_WD_WA";
  255. int ReducedPlayCost() => Math.Max(0, card.Owner.SecurityCards.Count(source => !source.IsFlipped));
  256. string SharedEffectName1()
  257. {
  258. return "May play 1 card with [Royal Base] in it's text for 1 less per face-up card in your security.";
  259. // saved until we can find a method to refresh between card activations - return $"May play 1 card with [Royal Base] in it's text for {ReducedPlayCost()} less.";
  260. }
  261. string SharedEffectDescription1(string tag)
  262. {
  263. return $"[{tag}] [Once Per Turn] You may play 1 card with [Royal Base] in its text from your hand. For each of your face-up security cards, reduce this effect's paid play cost by 1.";
  264. }
  265. bool SharedCanActivateCondition1(Hashtable hashtable, ActivateClass activateClass)
  266. {
  267. activateClass.SetEffectName(SharedEffectName1());
  268. return CardEffectCommons.IsExistOnBattleArea(card)
  269. && CardEffectCommons.HasMatchConditionOwnersHand(card, cardSource => CanSelectCardCondition1(cardSource, activateClass));
  270. }
  271. bool CanSelectCardCondition1(CardSource cardSource, ActivateClass activateClass)
  272. {
  273. return cardSource.HasPlayCost
  274. && cardSource.HasText("Royal Base")
  275. && CardEffectCommons.CanPlayAsNewPermanent(cardSource, false, activateClass);
  276. }
  277. IEnumerator SharedActivateCoroutine1(Hashtable hashtable, ActivateClass activateClass)
  278. {
  279. List<CardSource> selectedCards = new List<CardSource>();
  280. int maxCount = 1;
  281. SelectHandEffect selectHandEffect = GManager.instance.GetComponent<SelectHandEffect>();
  282. selectHandEffect.SetUp(
  283. selectPlayer: card.Owner,
  284. canTargetCondition: cardSource => CanSelectCardCondition1(cardSource, activateClass),
  285. canTargetCondition_ByPreSelecetedList: null,
  286. canEndSelectCondition: null,
  287. maxCount: maxCount,
  288. canNoSelect: false,
  289. canEndNotMax: false,
  290. isShowOpponent: true,
  291. selectCardCoroutine: SelectCardCoroutine,
  292. afterSelectCardCoroutine: null,
  293. mode: SelectHandEffect.Mode.Custom,
  294. cardEffect: activateClass);
  295. selectHandEffect.SetUpCustomMessage("Select 1 card to play.", "The opponent is selecting 1 card to play.");
  296. selectHandEffect.SetUpCustomMessage_ShowCard("Played Card");
  297. yield return StartCoroutine(selectHandEffect.Activate());
  298. IEnumerator SelectCardCoroutine(CardSource cardSource)
  299. {
  300. selectedCards.Add(cardSource);
  301. yield return null;
  302. }
  303. #region Reduce play cost
  304. ChangeCostClass changeCostClass = new ChangeCostClass();
  305. changeCostClass.SetUpICardEffect($"Play Cost -{ReducedPlayCost()}", CanUseCondition1, card);
  306. changeCostClass.SetUpChangeCostClass(changeCostFunc: ChangeCost, cardSourceCondition: CardSourceCondition, rootCondition: RootCondition, isUpDown: isUpDown, isCheckAvailability: () => false, isChangePayingCost: () => true);
  307. Func<EffectTiming, ICardEffect> getCardEffect = GetCardEffect;
  308. card.Owner.UntilCalculateFixedCostEffect.Add(getCardEffect);
  309. ICardEffect GetCardEffect(EffectTiming _timing)
  310. {
  311. if (_timing == EffectTiming.None)
  312. {
  313. return changeCostClass;
  314. }
  315. return null;
  316. }
  317. bool CanUseCondition1(Hashtable hashtable)
  318. {
  319. return true;
  320. }
  321. int ChangeCost(CardSource cardSource, int Cost, SelectCardEffect.Root root, List<Permanent> targetPermanents)
  322. {
  323. if (CardSourceCondition(cardSource))
  324. {
  325. if (RootCondition(root))
  326. {
  327. if (PermanentsCondition(targetPermanents))
  328. {
  329. Cost -= ReducedPlayCost();
  330. }
  331. }
  332. }
  333. return Cost;
  334. }
  335. bool PermanentsCondition(List<Permanent> targetPermanents)
  336. {
  337. if (targetPermanents == null)
  338. {
  339. return true;
  340. }
  341. else
  342. {
  343. if (targetPermanents.Count((targetPermanent) => targetPermanent != null) == 0)
  344. {
  345. return true;
  346. }
  347. }
  348. return false;
  349. }
  350. bool CardSourceCondition(CardSource cardSource)
  351. {
  352. return cardSource != null
  353. && cardSource.Owner == card.Owner
  354. && cardSource.HasPlayCost
  355. && cardSource.HasText("Royal Base");
  356. }
  357. bool RootCondition(SelectCardEffect.Root root)
  358. {
  359. return true;
  360. }
  361. bool isUpDown()
  362. {
  363. return true;
  364. }
  365. #endregion
  366. yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards(
  367. cardSources: selectedCards,
  368. activateClass: activateClass,
  369. payCost: true,
  370. isTapped: false,
  371. root: SelectCardEffect.Root.Hand,
  372. activateETB: true
  373. ));
  374. #region Release reducing play cost
  375. card.Owner.UntilCalculateFixedCostEffect.Remove(getCardEffect);
  376. #endregion
  377. }
  378. #endregion
  379. #region When Digivolving1
  380. if (timing == EffectTiming.OnEnterFieldAnyone)
  381. {
  382. ActivateClass activateClass = new ActivateClass();
  383. activateClass.SetUpICardEffect(SharedEffectName1(), CanUseCondition, card);
  384. activateClass.SetUpActivateClass(hash => SharedCanActivateCondition1(hash, activateClass), (hash) => SharedActivateCoroutine1(hash, activateClass), 1, true, SharedEffectDescription1("When Digivolving"));
  385. activateClass.SetHashString(SharedHashString1);
  386. cardEffects.Add(activateClass);
  387. bool CanUseCondition(Hashtable hashtable)
  388. {
  389. return CardEffectCommons.CanTriggerWhenDigivolving(hashtable, card)
  390. && CardEffectCommons.IsExistOnBattleArea(card);
  391. }
  392. }
  393. #endregion
  394. #region When Attacking1
  395. if (timing == EffectTiming.OnAllyAttack)
  396. {
  397. ActivateClass activateClass = new ActivateClass();
  398. activateClass.SetUpICardEffect(SharedEffectName1(), CanUseCondition, card);
  399. activateClass.SetUpActivateClass(hash => SharedCanActivateCondition1(hash, activateClass), hash => SharedActivateCoroutine1(hash, activateClass), 1, true, SharedEffectDescription1("When Attacking"));
  400. activateClass.SetHashString(SharedHashString1);
  401. cardEffects.Add(activateClass);
  402. bool CanUseCondition(Hashtable hashtable)
  403. {
  404. return CardEffectCommons.CanTriggerOnAttack(hashtable, card) &&
  405. CardEffectCommons.IsExistOnBattleArea(card);
  406. }
  407. }
  408. #endregion
  409. return cardEffects;
  410. }
  411. }
  412. }