Esempio n. 1
0
        public override IEnumerator UsePower(int index = 0)
        {
            //Each Player may Draw 2 Cards. Then Destroy this Card.
            LinqTurnTakerCriteria heroCriteria = new LinqTurnTakerCriteria((TurnTaker tt) => tt.IsHero && !tt.ToHero().IsIncapacitatedOrOutOfGame, "active heroes");
            IEnumerator           coroutine    = GameController.DrawCards(heroCriteria, 2, optional: true, cardSource: GetCardSource());

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

            coroutine = DestroyThisCardResponse(null);
            if (UseUnityCoroutines)
            {
                yield return(GameController.StartCoroutine(coroutine));
            }
            else
            {
                GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
        private IEnumerator TwoPlayersMayDrawACard()
        {
            LinqTurnTakerCriteria    criteria = new LinqTurnTakerCriteria(tt => tt.IsHero && !tt.IsIncapacitatedOrOutOfGame && GameController.IsTurnTakerVisibleToCardSource(tt, GetCardSource()));
            SelectTurnTakersDecision selectTurnTakersDecision = new SelectTurnTakersDecision(GameController, DecisionMaker, criteria, SelectionType.DrawCard, numberOfTurnTakers: 2, cardSource: GetCardSource());;
            IEnumerator coroutine = GameController.SelectTurnTakersAndDoAction(selectTurnTakersDecision, tt => DrawCard(hero: tt.ToHero(), optional: true));

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

            yield break;
        }
Esempio n. 3
0
        protected override IEnumerator SelectZombieTarget(List <MoveCardDestination> storedResults, List <IDecision> decisionSources, bool isPutIntoPlay, LinqTurnTakerCriteria additionalCriteria = null)
        {
            List <Card> storeHighest = new List <Card>();
            var         coroutine    = GameController.FindTargetWithHighestHitPoints(1, c => c.IsHeroCharacterCard && (additionalCriteria?.Criteria(c.Owner) ?? true), storeHighest, cardSource: GetCardSource());

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            if (storeHighest.Any())
            {
                storedResults.Add(new MoveCardDestination(storeHighest.First().NextToLocation));
            }
        }
Esempio n. 4
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //Play this card next to the hero with the lowest HP
            List <Card> foundTarget = new List <Card>();
            IEnumerator coroutine   = base.GameController.FindTargetWithLowestHitPoints(1, (Card c) => c.IsHero && (overridePlayArea == null || c.IsAtLocationRecursive(overridePlayArea)), foundTarget, cardSource: base.GetCardSource());

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            Card lowestHero = foundTarget.FirstOrDefault();

            if (lowestHero != null && storedResults != null)
            {
                //Play this card next to the hero with the lowest HP
                storedResults.Add(new MoveCardDestination(lowestHero.NextToLocation, false, false, false));
            }
            yield break;
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            IEnumerator coroutine;

            if (this.TurnTakerControllerWithoutReplacements.HasMultipleCharacterCards)
            {
                List <SelectCardDecision> selectedKnight = new List <SelectCardDecision> {
                };
                coroutine = SelectOwnCharacterCard(selectedKnight, SelectionType.HeroCharacterCard);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }

                if (DidSelectCard(selectedKnight))
                {
                    AddCardPropertyJournalEntry(RoninKey, selectedKnight.FirstOrDefault().SelectedCard);
                }
            }

            coroutine = base.DeterminePlayLocation(storedResults, isPutIntoPlay, decisionSources, overridePlayArea, additionalTurnTakerCriteria);
            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }

            yield break;
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            // Find what to go next to.
            IEnumerator coroutine = this.SelectCardThisCardWillMoveNextTo(this.NextToCriteria, storedResults, isPutIntoPlay, decisionSources);

            if (this.UseUnityCoroutines)
            {
                yield return(this.GameController.StartCoroutine(coroutine));
            }
            else
            {
                this.GameController.ExhaustCoroutine(coroutine);
            }
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //"Play this card next to a target.",
            //"Whenever that target would take damage, redirect that damage to {TheKnight}. Damage redirected this way is irreducible."
            IEnumerator coroutine = base.SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => c.IsTarget && c.IsInPlayAndHasGameText, "targets", false), storedResults, isPutIntoPlay, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //"Play this card next to a card with a power on it.",
            IEnumerable <Card> viableCards = FindCardsWhere((Card c) => c.IsInPlayAndHasGameText && GameController.GetAllPowersForCardController(FindCardController(c)).Any());
            IEnumerator        coroutine   = SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => viableCards.Contains(c)), storedResults, isPutIntoPlay, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
Esempio n. 9
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            var equip = SelectCardThisCardWillMoveNextTo(new LinqCardCriteria(c => c.IsHeroCharacterCard), storedResults, isPutIntoPlay, decisionSources);

            if (UseUnityCoroutines)
            {
                yield return(this.GameController.StartCoroutine(equip));
            }
            else
            {
                this.GameController.ExhaustCoroutine(equip);
            }
        }
        protected override IEnumerator SelectZombieTarget(List <MoveCardDestination> storedResults, List <IDecision> decisionSources, bool isPutIntoPlay, LinqTurnTakerCriteria additionalCriteria = null)
        {
            List <TurnTaker> turnTakers = new List <TurnTaker>();
            var coroutine = FindHeroWithMostCardsInHand(turnTakers, 1, 1, additionalCriteria);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            coroutine = SelectCardThisCardWillMoveNextTo(new LinqCardCriteria(c => c.IsHeroCharacterCard && turnTakers.Contains(c.Owner), "hero character"), storedResults, isPutIntoPlay, decisionSources);
            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
        }
        public override IEnumerator UseIncapacitatedAbility(int index)
        {
            IEnumerator routine;
            List <SelectTurnTakerDecision> storedHero;
            List <DestroyCardAction>       storedDestroy;
            LinqCardCriteria      cardCriteria;
            LinqTurnTakerCriteria heroCriteria;

            switch (index)
            {
            case 0:

                // One player may destroy 1 of their ongoing cards to draw 3 cards.

                storedDestroy = new List <DestroyCardAction> {
                };
                storedHero    = new List <SelectTurnTakerDecision> {
                };
                cardCriteria  = new LinqCardCriteria(c => c.IsOngoing, "ongoing");
                heroCriteria  = new LinqTurnTakerCriteria(tt => tt.GetCardsWhere((Card c) => c.IsInPlayAndHasGameText && c.IsOngoing).Any());

                routine = GameController.SelectHeroToDestroyTheirCard(DecisionMaker, (httc) => cardCriteria, additionalCriteria: heroCriteria, storedResultsTurnTaker: storedHero, storedResultsAction: storedDestroy, cardSource: GetCardSource());
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(routine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(routine);
                }

                if (DidDestroyCard(storedDestroy))
                {
                    HeroTurnTakerController httc = base.FindHeroTurnTakerController(GetSelectedTurnTaker(storedHero).ToHero());

                    routine = GameController.DrawCards(httc, Incapacitate1CardsToDraw, cardSource: GetCardSource());
                    if (base.UseUnityCoroutines)
                    {
                        yield return(base.GameController.StartCoroutine(routine));
                    }
                    else
                    {
                        base.GameController.ExhaustCoroutine(routine);
                    }
                }

                break;

            case 1:

                // One player may destroy 1 of their equipment cards to play 3 cards.
                storedDestroy = new List <DestroyCardAction> {
                };
                storedHero    = new List <SelectTurnTakerDecision> {
                };
                cardCriteria  = new LinqCardCriteria(c => IsEquipment(c), "equipment");
                heroCriteria  = new LinqTurnTakerCriteria(tt => tt.GetCardsWhere((Card c) => c.IsInPlayAndHasGameText && IsEquipment(c)).Any());

                routine = GameController.SelectHeroToDestroyTheirCard(DecisionMaker, (httc) => cardCriteria, additionalCriteria: heroCriteria, storedResultsTurnTaker: storedHero, storedResultsAction: storedDestroy, cardSource: GetCardSource());
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(routine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(routine);
                }

                if (DidDestroyCard(storedDestroy))
                {
                    HeroTurnTakerController httc = base.FindHeroTurnTakerController(GetSelectedTurnTaker(storedHero).ToHero());

                    routine = GameController.SelectAndPlayCardsFromHand(httc, Incapacitate2CardsToPlay, false, cardSource: GetCardSource());
                    if (base.UseUnityCoroutines)
                    {
                        yield return(base.GameController.StartCoroutine(routine));
                    }
                    else
                    {
                        base.GameController.ExhaustCoroutine(routine);
                    }
                }

                break;

            case 2:

                // One target regains 1 HP.
                routine = base.GameController.SelectAndGainHP(this.HeroTurnTakerController, Incapacitate3HpGain,
                                                              cardSource: GetCardSource());

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

                break;
            }
        }
Esempio n. 12
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            var place = (this as CardController).DeterminePlayLocation(storedResults, isPutIntoPlay, decisionSources, overridePlayArea, additionalTurnTakerCriteria);

            if (UseUnityCoroutines)
            {
                yield return(this.GameController.StartCoroutine(place));
            }
            else
            {
                this.GameController.ExhaustCoroutine(place);
            }
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            if (playToTheLeft != null && playToTheLeft.Value)
            {
                IEnumerator coroutine = MoveCardIntoFarLeft(base.Card);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }
            }

            storedResults.Add(new MoveCardDestination(TurnTaker.PlayArea));

            yield return(null);
        }
Esempio n. 14
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            IEnumerator coroutine;

            if (this.TurnTakerControllerWithoutReplacements.HasMultipleCharacterCards && !_useSpecialAssignment)
            {
                coroutine = SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => IsOwnCharacterCard(c), "Knight character"), storedResults, isPutIntoPlay, decisionSources);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }
                if (storedResults.Any() && storedResults.FirstOrDefault().Location.IsNextToCard)
                {
                    AddCardPropertyJournalEntry(RoninKey, storedResults.FirstOrDefault().Location.OwnerCard);
                }
            }
            else
            {
                coroutine = base.DeterminePlayLocation(storedResults, isPutIntoPlay, decisionSources, overridePlayArea, additionalTurnTakerCriteria);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }
            }
            yield break;
        }
Esempio n. 15
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            IEnumerator coroutine = base.SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => this.NextToCardCriteria.Criteria(c) && (additionalTurnTakerCriteria == null || additionalTurnTakerCriteria.Criteria(c.Owner)), this.NextToCardCriteria.Description, true, false, null, null, false), storedResults, isPutIntoPlay, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
Esempio n. 16
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //"Play this card next to a target"
            IEnumerator coroutine = SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => c.IsTarget && c.IsInPlay, "targets", useCardsSuffix: false), storedResults, isPutIntoPlay, decisionSources);

            if (UseUnityCoroutines)
            {
                yield return(GameController.StartCoroutine(coroutine));
            }
            else
            {
                GameController.ExhaustCoroutine(coroutine);
            }
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //Play this card next to the hero with the most cards in hand.

            //find hero with the most cards in hand
            List <TurnTaker> storedMostCards = new List <TurnTaker>();
            IEnumerator      coroutine       = base.FindHeroWithMostCardsInHand(storedMostCards);

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

            //select the hero with the most cards in hand, resolving ties
            IEnumerator coroutine2 = base.SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => storedMostCards.Contains(c.Owner) && c.IsHeroCharacterCard && (additionalTurnTakerCriteria == null || additionalTurnTakerCriteria.Criteria(c.Owner)), "hero target with the most cards in hand"), storedResults, isPutIntoPlay, decisionSources);

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

            yield break;
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //Play this card next to the hero with the highest HP
            IEnumerator coroutine = base.SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => base.CanCardBeConsideredHighestHitPoints(c, (Card card) => card.IsHeroCharacterCard) && (additionalTurnTakerCriteria == null || additionalTurnTakerCriteria.Criteria(c.Owner)), "hero target with the lowest HP"), storedResults, isPutIntoPlay, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
Esempio n. 19
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //if we're given a hero to go to, go there
            if (NextToHeroToGoTo != null)
            {
                storedResults.Add(new MoveCardDestination(NextToHeroToGoTo));
                NextToHeroToGoTo = null;
                yield break;
            }

            //Play this card next to a target.
            IEnumerator coroutine = base.SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => c.IsTarget, "target"), storedResults, true, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
Esempio n. 20
0
        public override IEnumerator Play()
        {
            // "The {H - 2} players with the most cards in play each destroy 1 of their non-character cards."
            // Find those players, store them as loadedHeroes...
            List <TurnTaker> loadedHeroes         = new List <TurnTaker>();
            IEnumerator      findPlayersCoroutine = base.FindHeroWithMostCardsInPlay(loadedHeroes, numberOfHeroes: base.H - 2);

            if (base.UseUnityCoroutines)
            {
                yield return(this.GameController.StartCoroutine(findPlayersCoroutine));
            }
            else
            {
                this.GameController.ExhaustCoroutine(findPlayersCoroutine);
            }
            Log.Debug("LightenTheLoadCardController.Play: loadedHeroes.Count = " + loadedHeroes.Count.ToString());
            foreach (TurnTaker hero in loadedHeroes)
            {
                Log.Debug("    " + hero.NameRespectingVariant);
            }
            LinqTurnTakerCriteria isListedHero = new LinqTurnTakerCriteria((TurnTaker tt) => tt.IsHero && loadedHeroes.Contains(tt));

            // Ask each of them to destroy a card if they have at least 1 in play
            List <DestroyCardAction> destroyAttempts  = new List <DestroyCardAction>();
            List <DestroyCardAction> playersDestroyed = new List <DestroyCardAction>();

            if (GameController.FindCardsWhere(new LinqCardCriteria((Card c) => !c.IsCharacter && loadedHeroes.Contains(c.Owner))).Any())
            {
                SelectTurnTakersDecision destroyOrder = new SelectTurnTakersDecision(base.GameController, this.DecisionMaker, isListedHero, SelectionType.DestroyCard, numberOfTurnTakers: Game.H - 2, allowAutoDecide: true, cardSource: GetCardSource());
                IEnumerator playersDestroyCoroutine   = base.GameController.SelectTurnTakersAndDoAction(destroyOrder, (TurnTaker tt) => base.GameController.SelectAndDestroyCard(base.FindHeroTurnTakerController(tt.ToHero()), cardCriteria: new LinqCardCriteria((Card c) => !c.IsCharacter && c.Owner == tt, "non-character"), false, storedResultsAction: playersDestroyed, cardSource: GetCardSource()));
                if (base.UseUnityCoroutines)
                {
                    yield return(this.GameController.StartCoroutine(playersDestroyCoroutine));
                }
                else
                {
                    this.GameController.ExhaustCoroutine(playersDestroyCoroutine);
                }
            }

            // "Destroy a hero card in the villain play area."
            List <DestroyCardAction> villainDestroyed = new List <DestroyCardAction>();
            IEnumerator villainDestroyCoroutine       = base.GameController.SelectAndDestroyCards(this.DecisionMaker, new LinqCardCriteria((Card c) => c.IsHero && c.Location.HighestRecursiveLocation == base.TurnTaker.FindCard("BreakawayCharacter").Location.HighestRecursiveLocation), new int?(1), storedResultsAction: villainDestroyed, responsibleCard: this.Card, cardSource: GetCardSource());

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

            // "If a card was destroyed this way, {Breakaway} regains 2 HP."
            DestroyCardAction villainAttempt = villainDestroyed.FirstOrDefault();

            if (villainAttempt != null && villainAttempt.WasCardDestroyed)
            {
                IEnumerator hpGainCoroutine = base.GameController.GainHP(base.TurnTaker.FindCard("BreakawayCharacter"), 2, cardSource: GetCardSource());
                if (base.UseUnityCoroutines)
                {
                    yield return(this.GameController.StartCoroutine(hpGainCoroutine));
                }
                else
                {
                    this.GameController.ExhaustCoroutine(hpGainCoroutine);
                }
            }

            // "Reduce the next damage dealt by each non-villain target by X, where X = 2 plus the number of cards destroyed by this card."
            destroyAttempts = destroyAttempts.Concat(playersDestroyed).ToList();
            destroyAttempts = destroyAttempts.Concat(villainDestroyed).ToList();
            List <DestroyCardAction> destroySuccesses = destroyAttempts.FindAll((DestroyCardAction da) => da.WasCardDestroyed);
            int reduction = 2 + destroySuccesses.Count();

            // Do ReduceNextDamage for EACH non-villain target in play
            foreach (Card nvt in base.GameController.FindTargetsInPlay((Card c) => c.IsNonVillainTarget))
            {
                IEnumerator reduceCoroutine = this.ReduceNextDamage(nvt, reduction);
                if (base.UseUnityCoroutines)
                {
                    yield return(this.GameController.StartCoroutine(reduceCoroutine));
                }
                else
                {
                    this.GameController.ExhaustCoroutine(reduceCoroutine);
                }
            }

            yield break;
        }
Esempio n. 21
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            List <Card> storedHeroes = new List <Card>();
            IEnumerator routine      = base.GameController.FindTargetWithLowestHitPoints(1,
                                                                                         c => c.IsHeroCharacterCard && !c.IsIncapacitatedOrOutOfGame && GameController.IsCardVisibleToCardSource(c, GetCardSource()),
                                                                                         storedHeroes, cardSource: this.GetCardSource());

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

            if (!storedHeroes.Any())
            {
                yield break;
            }

            routine = base.SelectCardThisCardWillMoveNextTo(new LinqCardCriteria(c => c == storedHeroes.First()),
                                                            storedResults, isPutIntoPlay, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(routine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(routine);
            }
        }
Esempio n. 22
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            IEnumerator coroutine = base.GameController.ChangeMaximumHP(base.Card, BaseHP + GetNumberOfRitualsInPlay(), true, cardSource: base.GetCardSource());

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

            coroutine = base.DeterminePlayLocation(storedResults, isPutIntoPlay, decisionSources, overridePlayArea, additionalTurnTakerCriteria);
            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //When this card enters play, place it next to the hero with the lowest HP.
            IEnumerator coroutine = base.SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => base.CanCardBeConsideredLowestHitPoints(c, (Card card) => card.IsHeroCharacterCard && !card.IsIncapacitatedOrOutOfGame && GameController.IsCardVisibleToCardSource(card, GetCardSource())) && (additionalTurnTakerCriteria == null || additionalTurnTakerCriteria.Criteria(c.Owner)), "hero with the lowest hp"), storedResults, isPutIntoPlay, decisionSources);

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

            yield break;
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //Play this card next to the target with the lowest HP, other than {SwarmEater}. The target next to this card is Pursued.
            List <Card> lowestCard = new List <Card>();
            IEnumerator coroutine  = base.GameController.FindTargetWithLowestHitPoints(1, (Card c) => c != base.CharacterCard, lowestCard, cardSource: base.GetCardSource());

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            Card selectedTarget = lowestCard.FirstOrDefault <Card>();

            if (selectedTarget != null && storedResults != null)
            {
                //Play this card next to the target with the lowest HP, other than {SwarmEater}.
                storedResults.Add(new MoveCardDestination(selectedTarget.NextToLocation, false, false, false));
            }
            yield break;
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            // "When this card enters play, move it next to a target."
            IEnumerator selectCoroutine = SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => c.IsTarget, "targets", false), storedResults, isPutIntoPlay, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(selectCoroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(selectCoroutine);
            }
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            // "When this card enters play, move it next to the hero with the most cards in hand."
            List <TurnTaker> biggestHands  = new List <TurnTaker>();
            IEnumerator      findCoroutine = FindHeroWithMostCardsInHand(biggestHands, ranking: 1, numberOfHeroes: 1, evenIfCannotDealDamage: true);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(findCoroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(findCoroutine);
            }
            TurnTaker player = biggestHands.FirstOrDefault();

            if (player != null && storedResults != null)
            {
                List <Card> characterChoice = new List <Card>();
                IEnumerator chooseCoroutine = FindCharacterCard(player, SelectionType.MoveCardNextToCard, characterChoice);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(chooseCoroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(chooseCoroutine);
                }
                Card chosen = characterChoice.FirstOrDefault();
                if (chosen != null)
                {
                    storedResults.Add(new MoveCardDestination(chosen.NextToLocation));
                }
            }
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //Play this card next to the hero character with the most cards in play.
            List <TurnTaker> storedTurnTaker = new List <TurnTaker>();
            IEnumerator      coroutine       = FindHeroWithMostCardsInPlay(storedTurnTaker, heroCriteria: new LinqTurnTakerCriteria(tt => GameController.IsTurnTakerVisibleToCardSource(tt, GetCardSource())));

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

            if (storedTurnTaker is null || storedTurnTaker.Count == 0)
            {
                yield break;
            }

            TurnTaker selectedTurnTaker = storedTurnTaker.First();

            coroutine = SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => c.Owner == selectedTurnTaker && c.IsHeroCharacterCard && !c.IsIncapacitatedOrOutOfGame && GameController.IsCardVisibleToCardSource(c, GetCardSource()) && (additionalTurnTakerCriteria == null || additionalTurnTakerCriteria.Criteria(c.Owner)), "active hero"), storedResults, isPutIntoPlay, decisionSources);
            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
        }
Esempio n. 28
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources,
                                                          Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //When this card enters play, place it next to a hero character.
            LinqCardCriteria validTargets = new LinqCardCriteria(c => c.IsHeroCharacterCard && c.IsTarget && c.IsInPlayAndHasGameText && (additionalTurnTakerCriteria == null || additionalTurnTakerCriteria.Criteria(c.Owner)), "hero character card");

            IEnumerator routine = base.SelectCardThisCardWillMoveNextTo(validTargets, storedResults, isPutIntoPlay, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(routine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(routine);
            }
        }
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            //"Play this card next to a non-character target.",
            IEnumerator coroutine = SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => c.IsInPlayAndHasGameText && c.IsTarget && !c.IsCharacter), storedResults, isPutIntoPlay, decisionSources);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
Esempio n. 30
0
        public override IEnumerator DeterminePlayLocation(List <MoveCardDestination> storedResults, bool isPutIntoPlay, List <IDecision> decisionSources, Location overridePlayArea = null, LinqTurnTakerCriteria additionalTurnTakerCriteria = null)
        {
            IEnumerator coroutine;

            if (this.IsMakeshiftShelterInPlay())
            {
                coroutine = base.SelectCardThisCardWillMoveNextTo(new LinqCardCriteria((Card c) => c.IsHeroCharacterCard && !c.IsIncapacitatedOrOutOfGame && GameController.IsCardVisibleToCardSource(c, GetCardSource()) && (additionalTurnTakerCriteria == null || additionalTurnTakerCriteria.Criteria(c.Owner)), "active hero"), storedResults, isPutIntoPlay, decisionSources);
            }
            else
            {
                coroutine = base.GameController.SelectMoveCardDestination(base.DecisionMaker, base.Card, new[] { new MoveCardDestination(base.TurnTaker.PlayArea) }, storedResults, cardSource: base.GetCardSource());
            }

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

            yield break;
        }