using System.Collections; using System.Collections.Generic; using System.Linq; using System; using System.Diagnostics; namespace DCGO.CardEffects.EX10 { public class EX10_061 : CEntity_Effect { public override List CardEffects(EffectTiming timing, CardSource card) { List cardEffects = new List(); #region Digivolution Requirements if (timing == EffectTiming.None) { bool PermanentCondition(Permanent targetPermanent) { return targetPermanent.TopCard.HasDarkMastersTrait && targetPermanent.TopCard.IsLevel6; } cardEffects.Add(CardEffectFactory.AddSelfDigivolutionRequirementStaticEffect(permanentCondition: PermanentCondition, digivolutionCost: 5, ignoreDigivolutionRequirement: false, card: card, condition: null)); } #endregion #region Cost Reduction #region Before Pay Cost - Condition Effect if (timing == EffectTiming.BeforePayCost) { ActivateClass activateClass = new ActivateClass(); activateClass.SetUpICardEffect("Placing 1 [Dark Masters] to get Play Cost -4", CanUseCondition, card); activateClass.SetUpActivateClass(CanActivateCondition, ActivateCoroutine, -1, false, EffectDiscription()); activateClass.SetHashString("PlayCost-_EX10-061"); cardEffects.Add(activateClass); string EffectDiscription() { return "When this card would be played, by placing 1 of each face-up [Dark Masters] trait card with different names from your security stack under this card, reduce the play cost by 4 for each card placed."; } bool CanSelectCardCondition(CardSource cardSource) { return cardSource.IsDigimon && !cardSource.IsFlipped && cardSource.HasDarkMastersTrait; } bool CardCondition(CardSource cardSource) { return cardSource == card; } bool CanNoSelect(CardSource cardSource) { if (cardSource != null) { if (cardSource.PayingCost(SelectCardEffect.Root.Hand, null, checkAvailability: false) > cardSource.Owner.MaxMemoryCost) { return false; } if (cardSource.PayingCost(SelectCardEffect.Root.Trash, null, checkAvailability: false) > cardSource.Owner.MaxMemoryCost) { return false; } if (cardSource.PayingCost(SelectCardEffect.Root.DigivolutionCards, null, checkAvailability: false) > cardSource.Owner.MaxMemoryCost) { return false; } if (cardSource.PayingCost(SelectCardEffect.Root.Security, null, checkAvailability: false) > cardSource.Owner.MaxMemoryCost) { return false; } if (cardSource.PayingCost(SelectCardEffect.Root.Library, null, checkAvailability: false) > cardSource.Owner.MaxMemoryCost) { return false; } } return true; } bool CanUseCondition(Hashtable hashtable) { return CardEffectCommons.CanTriggerWhenPermanentWouldPlay(hashtable, CardCondition); } bool CanActivateCondition(Hashtable hashtable) { return CardEffectCommons.HasMatchConditionOwnersSecurity(card, CanSelectCardCondition, false); } IEnumerator ActivateCoroutine(Hashtable _hashtable) { List digivolutionCards = new List(); bool CanSelectSecurityCardCondition(CardSource cardSource) { if (CanSelectCardCondition(cardSource)) { if (digivolutionCards.Count((filteredCard) => filteredCard.CardNames.Contains(cardSource.CardNames[0])) == 0) { return true; } } return false; } if (CardEffectCommons.HasMatchConditionOwnersSecurity(card, CanSelectSecurityCardCondition, false)) { bool noSelect = CanNoSelect(CardEffectCommons.GetCardFromHashtable(_hashtable)); List selectedCards = new List(); List cardNames = card.Owner.SecurityCards.Filter(CanSelectSecurityCardCondition) .Map(cardSource1 => cardSource1.CardNames) .Flat() .Distinct() .ToList(); int maxCount = Math.Min(4, cardNames.Count); if (maxCount >= 1) { SelectCardEffect selectCardEffect = GManager.instance.GetComponent(); selectCardEffect.SetUp( canTargetCondition: CanSelectSecurityCardCondition, canTargetCondition_ByPreSelecetedList: CanTargetCondition_ByPreSelecetedList, canEndSelectCondition: CanEndSelectCondition, canNoSelect: () => noSelect, selectCardCoroutine: SelectCardCoroutine, afterSelectCardCoroutine: null, message: "Select cards to place in Digivolution cards.", maxCount: maxCount, canEndNotMax: false, isShowOpponent: true, mode: SelectCardEffect.Mode.Custom, root: SelectCardEffect.Root.Security, customRootCardList: null, canLookReverseCard: false, selectPlayer: card.Owner, cardEffect: activateClass); yield return ContinuousController.instance.StartCoroutine(selectCardEffect.Activate()); bool CanTargetCondition_ByPreSelecetedList(List cardSources, CardSource cardSource) { List cardNames = new List(); foreach (CardSource cardSource1 in cardSources) { if (!cardNames.Contains(cardSource1.CardNames[0])) { cardNames.Add(cardSource1.CardNames[0]); } } foreach (CardSource cardSource1 in digivolutionCards) { if (!cardNames.Contains(cardSource1.CardNames[0])) { cardNames.Add(cardSource1.CardNames[0]); } } if (cardNames.Contains(cardSource.CardNames[0])) { return false; } return true; } bool CanEndSelectCondition(List cardSources) { List cardNames = new List(); foreach (CardSource cardSource1 in cardSources) { if (!cardNames.Contains(cardSource1.CardNames[0])) { cardNames.Add(cardSource1.CardNames[0]); } } foreach (CardSource cardSource1 in digivolutionCards) { if (!cardNames.Contains(cardSource1.CardNames[0])) { cardNames.Add(cardSource1.CardNames[0]); } } if (cardNames.Count != cardSources.Count + digivolutionCards.Count) { return false; } return true; } IEnumerator SelectCardCoroutine(CardSource cardSource) { selectedCards.Add(cardSource); digivolutionCards.Add(cardSource); yield return null; } if (selectedCards.Count >= 1) { GManager.instance.GetComponent().AddDigivolutionCardInfos(new AddDigivolutionCardsInfo(activateClass, selectedCards)); yield return ContinuousController.instance.StartCoroutine(new IReduceSecurity( player: card.Owner, refSkillInfos: ref ContinuousController.instance.nullSkillInfos, cardEffect: activateClass).ReduceSecurity()); yield return ContinuousController.instance.StartCoroutine(AfterSelectCardCoroutine(selectedCards)); } } } IEnumerator AfterSelectCardCoroutine(List cardSources) { if (card.Owner.CanReduceCost(null, card)) { ContinuousController.instance.PlaySE(GManager.instance.GetComponent().BuffSE); } ChangeCostClass changeCostClass = new ChangeCostClass(); changeCostClass.SetUpICardEffect("Play Cost -4", CanUseCondition1, card); changeCostClass.SetUpChangeCostClass(changeCostFunc: ChangeCost, cardSourceCondition: CardSourceCondition, rootCondition: RootCondition, isUpDown: isUpDown, isCheckAvailability: () => false, isChangePayingCost: () => true); card.Owner.UntilCalculateFixedCostEffect.Add((_timing) => changeCostClass); bool CanUseCondition1(Hashtable hashtable) { return true; } int ChangeCost(CardSource cardSource, int Cost, SelectCardEffect.Root root, List targetPermanents) { if (CardSourceCondition(cardSource)) { if (RootCondition(root)) { if (PermanentsCondition(targetPermanents)) { Cost -= cardSources.Count * 4; } } } return Cost; } bool PermanentsCondition(List targetPermanents) { if (targetPermanents == null) { return true; } else { if (targetPermanents.Count((targetPermanent) => targetPermanent != null) == 0) { return true; } } return false; } bool CardSourceCondition(CardSource cardSource) { return cardSource == card; } bool RootCondition(SelectCardEffect.Root root) { return true; } bool isUpDown() { return true; } yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.ShowReducedCost(_hashtable)); yield return null; } } } #endregion #region Reduce Play Cost - Not Shown if (timing == EffectTiming.None) { ChangeCostClass changeCostClass = new ChangeCostClass(); changeCostClass.SetUpICardEffect("Play Cost -4", CanUseCondition, card); changeCostClass.SetUpChangeCostClass(changeCostFunc: ChangeCost, cardSourceCondition: CardSourceCondition, rootCondition: RootCondition, isUpDown: isUpDown, isCheckAvailability: () => true, isChangePayingCost: () => true); changeCostClass.SetNotShowUI(true); cardEffects.Add(changeCostClass); bool CanSelectCardCondition(CardSource cardSource) { return cardSource.IsDigimon && !cardSource.IsFlipped && cardSource.EqualsTraits("Dark Masters"); } bool CanUseCondition(Hashtable hashtable) { ICardEffect activateClass = card.EffectList(EffectTiming.BeforePayCost).Find(cardEffect => cardEffect.EffectName == "Placing 1 [Dark Masters] to get Play Cost -4"); if (activateClass != null) { return CardEffectCommons.HasMatchConditionOwnersSecurity(card, CanSelectCardCondition, false); } return false; } int ChangeCost(CardSource cardSource, int Cost, SelectCardEffect.Root root, List targetPermanents) { if (CardSourceCondition(cardSource)) { if (RootCondition(root)) { if (PermanentsCondition(targetPermanents)) { List securitySources = card.Owner.SecurityCards.Filter(CanSelectCardCondition); int targetCount = (from securityCard in securitySources select securityCard.CardNames).Distinct().Count(); Cost -= targetCount * 4; } } } return Cost; } bool PermanentsCondition(List targetPermanents) { if (targetPermanents == null) { return true; } else { if (targetPermanents.Count((targetPermanent) => targetPermanent != null) == 0) { return true; } } return false; } bool CardSourceCondition(CardSource cardSource) { if (cardSource != null) { if (cardSource == card) { return true; } } return false; } bool RootCondition(SelectCardEffect.Root root) { return true; } bool isUpDown() { return true; } } #endregion #endregion #region Shared OP / WD string SharedEffectName = "Play 1 [Dark Masters] from sources, give , Delete them at end of turn"; string SharedEffectDescription(string tag) => $"[{tag}] You may play 1 of each [Dark Masters] trait card with different names from this Digimon's digivolution cards without paying the costs. Then, all of your [Dark Masters] trait Digimon gain for the turn. At turn end, delete the Digimon this effect played."; bool SharedCanActivateCondition(Hashtable hashtable) => CardEffectCommons.IsExistOnBattleAreaDigimon(card); bool CanPlayDarkMaster(CardSource cardSource, ActivateClass activateClass) { return cardSource.IsDigimon && cardSource.EqualsTraits("Dark Masters") && CardEffectCommons.CanPlayAsNewPermanent(cardSource: cardSource, payCost: false, cardEffect: activateClass, root:SelectCardEffect.Root.DigivolutionCards); } bool CanTargetCondition_ByPreSelecetedList(List cardSources, CardSource cardSource) { List cardNames = GetNamesList(cardSources); foreach (string name in cardNames) { if (cardSource.CardNames.Contains(name)) return false; } return true; } List GetNamesList(List cardSources) { List cardNames = new List(); foreach (CardSource cardName in cardSources) { foreach (string name in cardName.CardNames) { if (!cardNames.Contains(name)) { cardNames.Add(name); } } } return cardNames; } IEnumerator SharedActivateCoroutine(Hashtable hashtable, ActivateClass activateClass) { Permanent selectedPermanent = card.PermanentOfThisCard(); if (selectedPermanent.DigivolutionCards.Count(cardSource => CanPlayDarkMaster(cardSource, activateClass)) >= 1) { int maxCount = Math.Min(4, selectedPermanent.DigivolutionCards.Count(cardSource => CanPlayDarkMaster(cardSource, activateClass))); List selectedCards = new List(); SelectCardEffect selectCardEffect = GManager.instance.GetComponent(); selectCardEffect.SetUp( canTargetCondition: cardSource => CanPlayDarkMaster(cardSource, activateClass), canTargetCondition_ByPreSelecetedList: CanTargetCondition_ByPreSelecetedList, canEndSelectCondition: null, canNoSelect: () => true, selectCardCoroutine: SelectCardCoroutine, afterSelectCardCoroutine: null, message: "Select 1 digivolution card to play.", maxCount: maxCount, canEndNotMax: false, isShowOpponent: true, mode: SelectCardEffect.Mode.Custom, root: SelectCardEffect.Root.Custom, customRootCardList: selectedPermanent.DigivolutionCards, canLookReverseCard: true, selectPlayer: card.Owner, cardEffect: activateClass); selectCardEffect.SetUpCustomMessage("Select 1 digivolution card to play.", "The opponent is selecting 1 digivolution card to play."); selectCardEffect.SetUpCustomMessage_ShowCard("Played Card"); yield return StartCoroutine(selectCardEffect.Activate()); IEnumerator SelectCardCoroutine(CardSource cardSource) { selectedCards.Add(cardSource); yield return null; } yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.PlayPermanentCards( cardSources: selectedCards, activateClass: activateClass, payCost: false, isTapped: false, root: SelectCardEffect.Root.DigivolutionCards, activateETB: true)); bool PermanentCondition(Permanent permanent) { return CardEffectCommons.IsPermanentExistsOnOwnerBattleAreaDigimon(permanent, card) && permanent.TopCard.EqualsTraits("Dark Masters"); } yield return ContinuousController.instance.StartCoroutine(CardEffectCommons.GainRushPlayerEffect( permanentCondition: PermanentCondition, effectDuration: EffectDuration.UntilEachTurnEnd, activateClass: activateClass)); #region Delete Digimon Played List playedPermanents = selectedCards.Map(cardSource => cardSource.PermanentOfThisCard()); ActivateClass activateClass1 = new ActivateClass(); Func cardEffectFunction = GetCardEffect; activateClass1.SetUpICardEffect("Delete the played Digimon", CanUseCondition2, card); activateClass1.SetUpActivateClass(CanActivateCondition1, ActivateCoroutine1, -1, false, EffectDescription1()); activateClass1.SetIsDigimonEffect(true); card.Owner.PermanentEffects.Add(cardEffectFunction); foreach(Permanent playedPermanent in playedPermanents) { if (!playedPermanent.TopCard.CanNotBeAffected(activateClass)) { yield return ContinuousController.instance.StartCoroutine(GManager.instance.GetComponent().CreateDebuffEffect(playedPermanent)); } } string EffectDescription1() { return "[End of Your Turn] Delete the Digimon that were played by Apocalymon."; } bool CanUseCondition2(Hashtable hashtable1) { return true; } bool CanActivateCondition1(Hashtable hashtable1) { return true; } IEnumerator ActivateCoroutine1(Hashtable _hashtable1) { yield return ContinuousController.instance.StartCoroutine(new DestroyPermanentsClass( playedPermanents, CardEffectCommons.CardEffectHashtable(activateClass1)).Destroy()); playedPermanents = playedPermanents.Filter(permanent => CardEffectCommons.IsPermanentExistsOnBattleArea(permanent)); if (playedPermanents.Count() <= 0)//Remove effect from activating every turn once all permanents deleted { card.Owner.PermanentEffects.Remove(cardEffectFunction); } } ICardEffect GetCardEffect(EffectTiming _timing) { if (_timing == EffectTiming.OnEndTurn) { return activateClass1; } return null; } #endregion } } #endregion #region On Play if (timing == EffectTiming.OnEnterFieldAnyone) { ActivateClass activateClass = new ActivateClass(); activateClass.SetUpICardEffect(SharedEffectName, CanUseCondition, card); activateClass.SetUpActivateClass(SharedCanActivateCondition, hash => SharedActivateCoroutine(hash, activateClass), -1, false, SharedEffectDescription("On Play")); cardEffects.Add(activateClass); bool CanUseCondition(Hashtable hashtable) { return CardEffectCommons.IsExistOnBattleAreaDigimon(card) && CardEffectCommons.CanTriggerOnPlay(hashtable, card); } } #endregion #region When Digivolving if (timing == EffectTiming.OnEnterFieldAnyone) { ActivateClass activateClass = new ActivateClass(); activateClass.SetUpICardEffect(SharedEffectName, CanUseCondition, card); activateClass.SetUpActivateClass(SharedCanActivateCondition, hash => SharedActivateCoroutine(hash, activateClass), -1, false, SharedEffectDescription("When Digivolving")); cardEffects.Add(activateClass); bool CanUseCondition(Hashtable hashtable) { return CardEffectCommons.IsExistOnBattleAreaDigimon(card) && CardEffectCommons.CanTriggerWhenDigivolving(hashtable, card); } } #endregion return cardEffects; } } }