public IEnumerator RetaliateRedirectResponse(DealDamageAction dda)
        {
            SetCardPropertyToTrueIfRealAction(OncePerTurn);
            // "... {TheGoalieCharacter} may deal the source of that damage 1 projectile damage."
            IEnumerator responseCoroutine = null;

            if (dda.DamageSource != null && dda.DamageSource.IsTarget)
            {
                responseCoroutine = DealDamage(base.CharacterCard, dda.DamageSource.Card, 1, DamageType.Projectile, optional: true, isCounterDamage: true, cardSource: GetCardSource());
            }
            else
            {
                responseCoroutine = base.GameController.SendMessageAction("Damage was not dealt by a target, so " + base.CharacterCard.Title + " can't retaliate...", Priority.High, GetCardSource(), associatedCards: base.CharacterCard.ToEnumerable());
            }
            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(responseCoroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(responseCoroutine);
            }
            // "Then, you may destroy a Goalposts card."
            List <DestroyCardAction> destroyed = new List <DestroyCardAction>();
            IEnumerator destroyCoroutine       = base.GameController.SelectAndDestroyCard(base.HeroTurnTakerController, GoalpostsCards, true, storedResultsAction: destroyed, responsibleCard: base.Card, cardSource: GetCardSource());

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(destroyCoroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(destroyCoroutine);
            }
            // "If you do, redirect damage dealt by that source to {TheGoalieCharacter} until the start of your turn."
            if (destroyed.FirstOrDefault() != null && destroyed.FirstOrDefault().WasCardDestroyed&& dda.DamageSource != null && dda.DamageSource.IsCard)
            {
                RedirectDamageStatusEffect focus = new RedirectDamageStatusEffect();
                focus.RedirectTarget = base.CharacterCard;
                focus.SourceCriteria.IsSpecificCard    = dda.DamageSource.Card;
                focus.TargetCriteria.IsNotSpecificCard = base.CharacterCard;
                focus.UntilStartOfNextTurn(base.TurnTaker);
                focus.UntilCardLeavesPlay(dda.DamageSource.Card);
                focus.TargetLeavesPlayExpiryCriteria.Card = base.CharacterCard;
                IEnumerator statusCoroutine = base.GameController.AddStatusEffect(focus, true, GetCardSource());
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(statusCoroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(statusCoroutine);
                }
            }
            yield break;
        }
Esempio n. 2
0
        public override IEnumerator Play()
        {
            List <SelectCardDecision> target = new List <SelectCardDecision>();
            //{Titan} deals 1 target 1 infernal damage.
            IEnumerator coroutine = base.GameController.SelectTargetsAndDealDamage(base.HeroTurnTakerController, new DamageSource(base.GameController, base.CharacterCard), 1, DamageType.Infernal, 1, false, 1, storedResultsDecisions: target, cardSource: base.GetCardSource());

            if (UseUnityCoroutines)
            {
                yield return(GameController.StartCoroutine(coroutine));
            }
            else
            {
                GameController.ExhaustCoroutine(coroutine);
            }

            if (target.FirstOrDefault() != null && target.FirstOrDefault().SelectedCard != null)
            {
                //Redirect the next damage dealt by that target back to itself.
                RedirectDamageStatusEffect statusEffect = new RedirectDamageStatusEffect()
                {
                    NumberOfUses   = 1,
                    RedirectTarget = target.FirstOrDefault().SelectedCard,
                    SourceCriteria = { IsSpecificCard = target.FirstOrDefault().SelectedCard }
                };
                statusEffect.UntilCardLeavesPlay(target.FirstOrDefault().SelectedCard);
                coroutine = base.AddStatusEffect(statusEffect);
                if (UseUnityCoroutines)
                {
                    yield return(GameController.StartCoroutine(coroutine));
                }
                else
                {
                    GameController.ExhaustCoroutine(coroutine);
                }
            }
            //If Titanform is in your trash, you may put it into play or into your hand.
            if (base.GetTitanform().Location.IsTrash)
            {
                IEnumerable <MoveCardDestination> locations = new MoveCardDestination[]
                {
                    new MoveCardDestination(base.TurnTaker.PlayArea),
                    new MoveCardDestination(base.HeroTurnTaker.Hand)
                };
                coroutine = base.GameController.SelectLocationAndMoveCard(base.HeroTurnTakerController, base.GetTitanform(), locations, true, cardSource: base.GetCardSource());
                if (UseUnityCoroutines)
                {
                    yield return(GameController.StartCoroutine(coroutine));
                }
                else
                {
                    GameController.ExhaustCoroutine(coroutine);
                }
            }
            yield break;
        }
Esempio n. 3
0
        public override IEnumerator UsePower(int index = 0)
        {
            //{Rockstar} deals one target 2 melee damage.
            int powerNumeral  = GetPowerNumeral(0, 2);
            int powerNumeral2 = GetPowerNumeral(1, 1);

            List <DealDamageAction> storedResults = new List <DealDamageAction>();
            IEnumerator             coroutine     = GameController.SelectTargetsAndDealDamage(HeroTurnTakerController, new DamageSource(GameController, CharacterCard), powerNumeral, DamageType.Melee, 1, false, 1, storedResultsDamage: storedResults, cardSource: GetCardSource());

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }

            if (DidDealDamage(storedResults))
            {
                Card target = storedResults.First().Target;
                //If a target takes damage this way, redirect all damage dealt by that target to { Rockstar} and reduce damage dealt by that target by 1 until the start of your next turn.
                RedirectDamageStatusEffect redirectEffect = new RedirectDamageStatusEffect();
                redirectEffect.SourceCriteria.IsSpecificCard = target;
                redirectEffect.UntilStartOfNextTurn(TurnTaker);
                redirectEffect.RedirectTarget = CharacterCard;
                redirectEffect.UntilCardLeavesPlay(target);
                redirectEffect.UntilTargetLeavesPlay(target);
                redirectEffect.TargetRemovedExpiryCriteria.Card = target;
                IEnumerator redirectCoroutine = AddStatusEffect(redirectEffect);

                ReduceDamageStatusEffect reduceEffect = new ReduceDamageStatusEffect(1);
                reduceEffect.SourceCriteria.IsSpecificCard = target;
                reduceEffect.UntilStartOfNextTurn(TurnTaker);
                reduceEffect.UntilCardLeavesPlay(target);
                reduceEffect.UntilTargetLeavesPlay(target);
                reduceEffect.TargetRemovedExpiryCriteria.Card = target;
                IEnumerator reduceCoroutine = AddStatusEffect(reduceEffect);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(redirectCoroutine));

                    yield return(base.GameController.StartCoroutine(reduceCoroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(redirectCoroutine);
                    base.GameController.ExhaustCoroutine(reduceCoroutine);
                }
            }
        }
Esempio n. 4
0
        public override IEnumerator UsePower(int index = 0)
        {
            //The next time {TheStranger} would deal himself damage, redirect it to another target.
            RedirectDamageStatusEffect effect = new RedirectDamageStatusEffect();

            effect.SourceCriteria.IsSpecificCard         = base.Card;
            effect.TargetCriteria.IsSpecificCard         = base.Card;
            effect.RedirectableTargets.IsTarget          = true;
            effect.RedirectableTargets.IsNotSpecificCard = base.Card;
            effect.NumberOfUses = 1;
            IEnumerator coroutine5 = AddStatusEffect(effect);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine5));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine5);
            }
            yield break;
        }
Esempio n. 5
0
        public override IEnumerator Play()
        {
            RedirectDamageStatusEffect redirectDamageStatusEffect = new RedirectDamageStatusEffect
            {
                RedirectTarget = base.CharacterCard
            };

            redirectDamageStatusEffect.SourceCriteria.IsVillain         = true;
            redirectDamageStatusEffect.TargetCriteria.IsNotSpecificCard = base.CharacterCard;
            redirectDamageStatusEffect.UntilStartOfNextTurn(base.TurnTaker);
            redirectDamageStatusEffect.TargetRemovedExpiryCriteria.Card = base.CharacterCard;
            IEnumerator coroutine = base.AddStatusEffect(redirectDamageStatusEffect, true);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
        public override IEnumerator UseIncapacitatedAbility(int index)
        {
            /*
             * "One player use a power now.",
             *  "Reveal the top card of 2 decks, then replace those cards.",
             *  "The next time a hero would be dealt damage, redirect that damage to a non-villain target."
             */

            switch (index)
            {
            case 0:
            {
                //"One player use a power now."
                IEnumerator coroutine = base.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: base.GetCardSource());
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }
                break;
            }

            case 1:
            {
                //"Reveal the top card of 2 decks, then replace those cards.",
                List <SelectLocationDecision> storedResults = new List <SelectLocationDecision>();
                IEnumerator coroutine = base.GameController.SelectADeck(this.DecisionMaker, SelectionType.RevealTopCardOfDeck, (Location l) => l.IsDeck && !l.OwnerTurnTaker.IsIncapacitatedOrOutOfGame, storedResults, cardSource: base.GetCardSource());
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }
                var location = GetSelectedLocation(storedResults);
                if (location != null)
                {
                    storedResults.Clear();
                    coroutine = RevealAndReplace(location);
                    if (base.UseUnityCoroutines)
                    {
                        yield return(base.GameController.StartCoroutine(coroutine));
                    }
                    else
                    {
                        base.GameController.ExhaustCoroutine(coroutine);
                    }

                    coroutine = base.GameController.SelectADeck(this.DecisionMaker, SelectionType.RevealTopCardOfDeck, (Location l) => l.IsDeck && !l.OwnerTurnTaker.IsIncapacitatedOrOutOfGame && l != location, storedResults, cardSource: base.GetCardSource());
                    if (base.UseUnityCoroutines)
                    {
                        yield return(base.GameController.StartCoroutine(coroutine));
                    }
                    else
                    {
                        base.GameController.ExhaustCoroutine(coroutine);
                    }

                    location = GetSelectedLocation(storedResults);
                    if (location != null)
                    {
                        storedResults.Clear();
                        coroutine = RevealAndReplace(location);
                        if (base.UseUnityCoroutines)
                        {
                            yield return(base.GameController.StartCoroutine(coroutine));
                        }
                        else
                        {
                            base.GameController.ExhaustCoroutine(coroutine);
                        }
                    }
                }
                break;
            }

            case 2:
            {
                //"The next time a hero would be dealt damage, redirect that damage to a non-villain target."
                var effect = new RedirectDamageStatusEffect();
                effect.NumberOfUses = 1;
                effect.RedirectableTargets.IsVillain = false;
                effect.RedirectableTargets.IsTarget  = true;
                effect.TargetCriteria.IsHero         = true;
                effect.TargetCriteria.IsTarget       = true;
                effect.CardSource = Card;

                var coroutine = base.AddStatusEffect(effect, true);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }
                break;
            }
            }
            yield break;
        }