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;
        }
예제 #2
0
        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;
        }