public override IEnumerator UsePower(int index = 0) { //"{Impact} deals 1 target 1 infernal damage. You may destroy 1 hero ongoing card to increase this damage by 2." int numTargets = GetPowerNumeral(0, 1); int numDamage = GetPowerNumeral(1, 1); int numToDestroy = GetPowerNumeral(2, 1); int numBoost = GetPowerNumeral(3, 2); if (numTargets < 1) { yield break; } //select the targets var targetDecision = new SelectTargetsDecision(GameController, DecisionMaker, (Card c) => c.IsInPlayAndHasGameText && c.IsTarget && GameController.IsCardVisibleToCardSource(c, GetCardSource()), 1, false, 1, false, new DamageSource(GameController, this.Card), numDamage, DamageType.Infernal, selectTargetsEvenIfCannotPerformAction: false, cardSource: GetCardSource()); IEnumerator coroutine = GameController.SelectCardsAndDoAction(targetDecision, _ => DoNothing()); if (base.UseUnityCoroutines) { yield return(base.GameController.StartCoroutine(coroutine)); } else { base.GameController.ExhaustCoroutine(coroutine); } var selectedTargets = targetDecision.SelectCardDecisions.Select(scd => scd.SelectedCard).Where((Card c) => c != null); if (selectedTargets.Count() == 0) { yield break; } //potentially destroy ongoings to boost the upcoming damage ITrigger boostTrigger = null; bool didDestroyCards = false; if (GameController.FindCardsWhere((Card c) => c.IsInPlayAndHasGameText && c.IsOngoing && c.IsHero && GameController.IsCardVisibleToCardSource(c, GetCardSource())).Count() >= numToDestroy) { var storedYesNo = new List <YesNoCardDecision> { }; coroutine = GameController.MakeYesNoCardDecision(DecisionMaker, SelectionType.IncreaseDamage, this.Card, storedResults: storedYesNo, cardSource: GetCardSource()); if (base.UseUnityCoroutines) { yield return(base.GameController.StartCoroutine(coroutine)); } else { base.GameController.ExhaustCoroutine(coroutine); } if (DidPlayerAnswerYes(storedYesNo)) { coroutine = GameController.SelectAndDestroyCards(DecisionMaker, new LinqCardCriteria(c => c.IsInPlayAndHasGameText && c.IsOngoing && c.IsHero && GameController.IsCardVisibleToCardSource(c, GetCardSource()), "hero ongoing"), numToDestroy, false, numToDestroy, cardSource: GetCardSource()); if (base.UseUnityCoroutines) { yield return(base.GameController.StartCoroutine(coroutine)); } else { base.GameController.ExhaustCoroutine(coroutine); } boostTrigger = new IncreaseDamageTrigger(GameController, (DealDamageAction dd) => dd.DamageSource.IsCard && dd.DamageSource.Card == this.Card && dd.CardSource != null && dd.CardSource.Card == this.Card, dd => GameController.IncreaseDamage(dd, numBoost, false, GetCardSource()), null, TriggerPriority.Medium, false, GetCardSource()); AddToTemporaryTriggerList(AddTrigger(boostTrigger)); didDestroyCards = true; } } //actually deal the damage coroutine = GameController.DealDamage(DecisionMaker, this.Card, (Card c) => selectedTargets.Contains(c), numDamage, DamageType.Infernal, cardSource: GetCardSource()); if (base.UseUnityCoroutines) { yield return(base.GameController.StartCoroutine(coroutine)); } else { base.GameController.ExhaustCoroutine(coroutine); } if (numTargets > 1) { coroutine = GameController.SelectTargetsAndDealDamage(DecisionMaker, new DamageSource(GameController, this.Card), numDamage, DamageType.Infernal, numTargets - 1, false, numTargets - 1, additionalCriteria: (Card c) => !selectedTargets.Contains(c), cardSource: GetCardSource()); if (base.UseUnityCoroutines) { yield return(base.GameController.StartCoroutine(coroutine)); } else { base.GameController.ExhaustCoroutine(coroutine); } } if (didDestroyCards) { RemoveTemporaryTrigger(boostTrigger); } yield break; }
public override IEnumerator UsePower(int index = 0) { //{Rockstar} deals 1 target 1 melee damage. //Increase this Damage by 2 if she has a Stage Presence Card in Play. int targets = GetPowerNumeral(0, 1); int dmg = GetPowerNumeral(1, 1); int boost = GetPowerNumeral(2, 2); ITrigger previewBoost = null; bool isStagePresenceInPlay = GetNumberOfStagePresenceInPlay() > 0; if (isStagePresenceInPlay) { previewBoost = AddIncreaseDamageTrigger((DealDamageAction dd) => !IsRealAction() && dd.CardSource != null && dd.CardSource.Card == Card && dd.CardSource.PowerSource != null, dd => boost); } //select the targets var targetDecision = new SelectTargetsDecision(GameController, DecisionMaker, (Card c) => c.IsInPlayAndHasGameText && c.IsTarget && GameController.IsCardVisibleToCardSource(c, GetCardSource()), targets, false, targets, false, new DamageSource(GameController, CharacterCard), dmg, DamageType.Melee, cardSource: GetCardSource()); IEnumerator coroutine = GameController.SelectCardsAndDoAction(targetDecision, _ => DoNothing()); if (base.UseUnityCoroutines) { yield return(base.GameController.StartCoroutine(coroutine)); } else { base.GameController.ExhaustCoroutine(coroutine); } if (isStagePresenceInPlay) { RemoveTrigger(previewBoost); } var selectedTargets = targetDecision.SelectCardDecisions.Select(scd => scd.SelectedCard).Where((Card c) => c != null); if (selectedTargets.Count() == 0) { yield break; } ITrigger boostTrigger = null; if (isStagePresenceInPlay) { boostTrigger = new IncreaseDamageTrigger(GameController, (DealDamageAction dd) => dd.DamageSource != null && dd.DamageSource.Card != null && dd.DamageSource.IsCard && dd.DamageSource.Card == CharacterCard && dd.CardSource != null && dd.CardSource.Card == this.Card && dd.CardSource.PowerSource != null, dd => GameController.IncreaseDamage(dd, boost, false, GetCardSource()), null, TriggerPriority.Medium, false, GetCardSource()); AddToTemporaryTriggerList(AddTrigger(boostTrigger)); } //actually deal the damage coroutine = GameController.DealDamage(DecisionMaker, CharacterCard, (Card c) => selectedTargets.Contains(c), dmg, DamageType.Melee, cardSource: GetCardSource()); if (base.UseUnityCoroutines) { yield return(base.GameController.StartCoroutine(coroutine)); } else { base.GameController.ExhaustCoroutine(coroutine); } if (targets > 1) { coroutine = GameController.SelectTargetsAndDealDamage(DecisionMaker, new DamageSource(GameController, CharacterCard), dmg, DamageType.Melee, targets - 1, false, targets - 1, additionalCriteria: (Card c) => !selectedTargets.Contains(c), cardSource: GetCardSource()); if (base.UseUnityCoroutines) { yield return(base.GameController.StartCoroutine(coroutine)); } else { base.GameController.ExhaustCoroutine(coroutine); } } if (isStagePresenceInPlay) { RemoveTemporaryTrigger(boostTrigger); } yield break; }