示例#1
0
    public LureOfTheDeepWilderness() : base(
            new SpiritPresence(
                new PresenceTrack(Track.Energy1, Track.Energy2, Track.MoonEnergy, Track.MkEnergy(3, Element.Plant), Track.MkEnergy(4, Element.Air), Track.Energy5Reclaim1),
                new PresenceTrack(Track.Card1, Track.Card2, Track.AnimalEnergy, Track.Card3, Track.Card4, Track.Card5Reclaim1)
                )
            , PowerCard.For <GiftOfTheUntamedWild>()
            , PowerCard.For <PerilsOfTheDeepestIsland>()
            , PowerCard.For <SoftlyBeckonEverInward>()
            , PowerCard.For <SwallowedByTheWilderness>()
            )
    {
        Growth = new Growth(
            new GrowthOption(new ReclaimAll(), new GainEnergy(1)),
            new GrowthOption(new PlacePresence(4, Target.Inland))
            ).Add(
            new GrowthOptionGroup(1,
                                  new GrowthOption(new Gain1Element(Element.Moon, Element.Air, Element.Plant), new GainEnergy(2)),
                                  new GrowthOption(new DrawPowerCard())
                                  )
            );

        Presence.IsValid = (s) => !s.IsOcean && !s.IsCoastal;

        InnatePowers = new InnatePower[] {
            InnatePower.For <ForsakeSocietyToChaseAfterDreams>(),
            InnatePower.For <NeverHeardFromAgain>()
        };
    }
示例#2
0
    public Bringer() : base(
            new SpiritPresence(
                new PresenceTrack(Track.Energy2, Track.AirEnergy, Track.Energy3, Track.MoonEnergy, Track.Energy4, Track.AnyEnergy, Track.Energy5),
                new PresenceTrack(Track.Card2, Track.Card2, Track.Card2, Track.Card3, Track.Card3, Track.AnyEnergy)
                ),
            PowerCard.For <CallOnMidnightsDream>(),
            PowerCard.For <DreadApparitions>(),
            PowerCard.For <DreamsOfTheDahan>(),
            PowerCard.For <PredatoryNightmares>()
            )
    {
        Growth = new(
            // reclaim, +1 power card
            new GrowthOption(new ReclaimAll(), new DrawPowerCard(1)),
            // reclaim 1, add presence range 0
            new GrowthOption(new ReclaimN(), new PlacePresence(0)),
            // +1 power card, +1 pressence range 1
            new GrowthOption(new DrawPowerCard(1), new PlacePresence(1)),
            // add presense range Dahan or Invadors, +2 energy
            new GrowthOption(new GainEnergy(2), new PlacePresence(4, Target.DahanOrInvaders))
            );

        this.InnatePowers = new InnatePower[] {
            InnatePower.For <SpiritsMayYetDream>(),
            InnatePower.For <NightTerrors>()
        };
    }
示例#3
0
    public GrinningTricksterStirsUpTrouble()
        : base(
            new SpiritPresence(
                new PresenceTrack(Track.Energy1, Track.MoonEnergy, Track.Energy2, Track.AnyEnergy, Track.FireEnergy, Track.Energy3),
                new PresenceTrack(Track.Card2, Track.Push1Dahan, Track.Card3, Track.Card3, Track.Card4, Track.AirEnergy, Track.Card5)
                )
            , PowerCard.For <ImpersonateAuthority>()
            , PowerCard.For <InciteTheMob>()
            , PowerCard.For <OverenthusiasticArson>()
            , PowerCard.For <UnexpectedTigers>()
            )
    {
        // Growth
        this.Growth = new Growth(2,
                                 new GrowthOption(new GainEnergy(-1), new ReclaimAll(), new MovePresence(1))
        {
            GainEnergy = -1
        },
                                 new GrowthOption(new PlacePresence(2)),
                                 new GrowthOption(new DrawPowerCard()),
                                 new GrowthOption(new GainEnergyEqualToCardPlays())
                                 );

        // Innates
        InnatePowers = new InnatePower[] {
            InnatePower.For <LetsSeeWhatHappens>(),
            InnatePower.For <WhyDontYouAndThemFight>()
        };
    }
示例#4
0
    public async Task Repeat_BadlandsWorksOnSameTargetTwice()
    {
        var fix    = new ConfigurableTestFixture();
        var space1 = fix.Board[3];

        // Given: 2 sun, 3 fire, 3 earth
        fix.InitElements("2 sun,3 fire,3 earth");

        //  And: target land has 1 presence, 2 Cities
        fix.Spirit.Presence.Adjust(space1, 1);
        fix.InitTokens(space1, "3C@3");

        // When: play card
        var task = PowerCard.For <ForestsOfLivingObsidian>().ActivateAsync(fix.SelfCtx);

        //  And: targeting space 1
        fix.Choose(space1);
        fix.Choose("C@2");           // 3C@2 - Damage 1 of them (1 of 1)
        fix.GameState.Tokens[space1].Summary.ShouldBe("1C@1,2C@2,1M");

        //  And: targeting space 1 a 2nd time
        fix.Choose(space1);          // Should Kill the 1C@1, and reduce the 2C@2 to 2C@1
        fix.Choose("C@1");           // Kill 1st City
        fix.Choose("C@1");           // Kill 2nd City
        fix.GameState.Tokens[space1].Summary.ShouldBe("2M");

        task.IsCompletedSuccessfully.ShouldBeTrue();
    }
示例#5
0
    static async Task PlayCardByPayingHalfCostOrForgetting(PowerCard card, SelfCtx ctx)
    {
        // target spirit may now play the major power they keep by:
        //    * paying half its cost (round up) OR
        int cost = (card.Cost + card.Cost % 2) / 2;
        var payingHalfCostOption = new SelfAction(
            $"paying {cost}",
            ctx => ctx.Self.PlayCard(card, cost)
            ).Matches(x => cost <= x.Self.Energy);

        //    * forgetting it at the end of turn.
        var forgettingCardOption = new SelfAction(
            $"forgetting at end of turn",
            ctx => {
            ctx.Self.PlayCard(card, 0);
            ctx.GameState.TimePasses_ThisRound.Push((gs) => {
                ctx.Self.Forget(card); return(Task.CompletedTask);                          // this must run befire cards are moved to discard, or it will be forgotten for Shifting Memories
            });
        }
            );

        // !!! It gains all elmemental thresholds.  - implement!

        await ctx.SelectAction_Optional($"Play {card.Name} now by:",
                                        payingHalfCostOption,
                                        forgettingCardOption
                                        );
    }
    public StarlightSeeksItsForm() : base(
            new SpiritPresence(
                new CompoundPresenceTrack(
                    new PresenceTrack(Track.Energy1, Track.Energy2, Track_PickElement, Track.Energy4),
                    new PresenceTrack(0, NewGrowth1),
                    new PresenceTrack(0, Track_Gain1Energy, NewGrowth3)               // missing +1 energies
                    ),
                new CompoundPresenceTrack(
                    new PresenceTrack(Track.Card2, Track_PickElement, Track_PickElement, Track.Card3),
                    new PresenceTrack(0, NewGrowth2),
                    new PresenceTrack(0, Track_Gain1Energy, NewGrowth4)               // !!! missing +1 energies
                    )
                )
            , PowerCard.For <BoonOfReimagining>()
            , PowerCard.For <GatherTheScatteredLightOfStars>()
            , PowerCard.For <PeaceOfTheNighttimeSky>()
            , PowerCard.For <ShapeTheSelfAnew>()
            )
    {
        Growth = new Growth(3,
                            new GrowthOption(new ReclaimN()),
                            new GrowthOption(new PlacePresence(0)),
                            new GrowthOption(new GainEnergy(1)),
                            new GrowthOption(new MovePresence(3))
                            );

        InnatePowers = new InnatePower[] {
            InnatePower.For <AirMovesEarthEndures>(),
            InnatePower.For <FireBurnsWaterSoothes>(),
            InnatePower.For <SiderealGuidance>(),
            InnatePower.For <WoodSeeksGrowthHumansSeekFreedom>(),
            InnatePower.For <StarsBlazeInTheDaytimeSky>(),
        };
    }
示例#7
0
    public Keeper() : base(
            new KeeperPresence(),
            // PowerCard.For<SkyStretchesToShore>(),
            PowerCard.For <BoonOfGrowingPower>(),
            PowerCard.For <RegrowFromRoots>(),
            PowerCard.For <SacrosanctWilderness>(),
            PowerCard.For <ToweringWrath>()
            )
    {
        (Presence as KeeperPresence).spirit = this;

        Growth = new Growth(2,
                            new GrowthOption(new ReclaimAll(), new GainEnergy(1))
        {
            GainEnergy = 1
        },
                            new GrowthOption(new DrawPowerCard(1)),
                            new GrowthOption(new GainEnergy(1), new PlacePresence(3, Target.PresenceOrWilds))
        {
            GainEnergy = 1
        },
                            new GrowthOption(new GainEnergy(-3), new DrawPowerCard(1), new PlacePresence(3, Target.NoBlight))
        {
            GainEnergy = -3
        }
                            );

        InnatePowers = new InnatePower[] {
            InnatePower.For <PunishThoseWhoTrespass>(),
            InnatePower.For <SpreadingWilds>(),
        };
    }
        public void BuildAndRavage_BecomesTwoBuilds()
        {
            List <string> invaderLog = new List <string>();

            // Given: Going to Ravage / Build in Jungle
            var(user, ctx) = TestSpirit.SetupGame(PowerCard.For <CallToTrade>(), (gs) => {
                var jungleCard  = new InvaderCard(Terrain.Jungle);
                gs.InvaderDeck  = InvaderDeck.BuildTestDeck(jungleCard, jungleCard, jungleCard, jungleCard);
                gs.NewLogEntry += (s) => invaderLog.Add(s.Msg());
            });

            // Given: advance to 2nd round where we have a ravage
            user.DoesNothingForARound();
            invaderLog.Clear();

            // Given: a space that IS-RAVAGE AND BUILD
            var spaceCtx = ctx.AllSpaces
                           .Select(ctx.Target)
                           .Last(s => s.MatchesRavageCard && s.MatchesBuildCard);        // last stays away from city and ocean

            invaderLog.Add("Selected target:" + spaceCtx.Space.Label);

            //  And: it has 3 explorers (in case dahan attacks during ravage, would still 1 left over
            Given_HasOnly3Explorers(spaceCtx);
            Given_Has2Dahan(spaceCtx);
            Given_NoSuroundingTowns(spaceCtx);
            Given_NoSuroundingDahan(spaceCtx);

            When_GrowsBuysAndActivatesCard(user, spaceCtx);

            spaceCtx.Tokens.InvaderSummary().ShouldBe("1C@3,1T@2,4E@1");
        }
    public override async Task ActivateAsync(SelfCtx ctx)
    {
        if (ctx.Self is not FracturedDaysSplitTheSky fracturedDays)
        {
            return;
        }

        var minor = fracturedDays.DtnwMinor;
        var major = fracturedDays.DtnwMajor;

        PowerCard card = await ctx.Self.SelectPowerCard("Gain Power Card from Days That Never Were", minor.Union(major), CardUse.AddToHand, Present.Always);

        if (card == null)
        {
            return;                      // in case both hands are empty.
        }
        fracturedDays.AddCardToHand(card);
        if (minor.Contains(card))
        {
            minor.Remove(card);
        }
        else
        {
            major.Remove(card);
            await fracturedDays.ForgetPowerCard_UserChoice(Present.Always);
        }
    }
示例#10
0
        public void OneRavage_ReplacedWithBuild()
        {
            var(user, ctx) = TestSpirit.SetupGame(PowerCard.For <CallToTrade>());

            // Given: advance to 2nd round where we have a ravage
            user.DoesNothingForARound();

            // Given: a space that IS-RAVAGE but NOT-BUILD
            var spaceCtx = ctx.AllSpaces
                           .Select(ctx.Target)
                           .Last(s => s.MatchesRavageCard && !s.MatchesBuildCard);        // last stays away from city and ocean

            //  And: it has 3 explorers (in case dahan attacks during ravage, would still 1 left over
            Given_HasOnly3Explorers(spaceCtx);
            Given_Has2Dahan(spaceCtx);
            Given_NoSuroundingTowns(spaceCtx);
            Given_NoSuroundingDahan(spaceCtx);

            string info = $"{spaceCtx.Space.Label} {ctx.GameState.InvaderDeck.Build.Single()} ";


            When_GrowsBuysAndActivatesCard(user, spaceCtx);

            // Then: Card converted ravage to a build
            spaceCtx.Tokens.InvaderSummary().ShouldBe("1T@2,3E@1");
        }
示例#11
0
        public void TerrorLevel3_RavageRemainsRavage()
        {
            var(user, ctx) = TestSpirit.SetupGame(PowerCard.For <CallToTrade>());

            // Elevate to Terror Level 3
            Given_TerrorLevelIs3(ctx);

            // Given: advance to 2nd round where we have a ravage
            user.DoesNothingForARound();

            // Given: a space that IS-RAVAGE but NOT-BUILD
            var spaceCtx = ctx.AllSpaces
                           .Select(ctx.Target)
                           .Last(s => s.MatchesRavageCard && !s.MatchesBuildCard);        // last stays away from city and ocean

            //  And: it has 3 explorers (in case dahan attacks during ravage, would still 1 left over
            Given_HasOnly3Explorers(spaceCtx);
            Given_Has2Dahan(spaceCtx);
            Given_NoSuroundingTowns(spaceCtx);
            Given_NoSuroundingDahan(spaceCtx);

            When_GrowsBuysAndActivatesCard(user, spaceCtx);

            // Then: Ravage remains - 3 explorers kill 1 dahan, remaining dahan kills 2 explorers
            spaceCtx.Tokens.InvaderSummary().ShouldBe("1E@1");
        }
示例#12
0
        public void MementoRestoresDeck()
        {
            PowerCardDeck deck = new PowerCardDeck(new PowerCard[] {
                PowerCard.For <Drought>(),
                PowerCard.For <DevouringAnts>(),
                PowerCard.For <DriftDownIntoSlumber>(),
                PowerCard.For <EnticingSplendor>(),
                PowerCard.For <LureOfTheUnknown>(),
                PowerCard.For <NaturesResilience>(),
                PowerCard.For <PullBeneathTheHungryEarth>(),
                PowerCard.For <QuickenTheEarthsStruggles>(),
                PowerCard.For <RainOfBlood>(),
                PowerCard.For <SapTheStrengthOfMultitudes>(),
                PowerCard.For <SongOfSanctity>(),
                PowerCard.For <SteamVents>(),
                PowerCard.For <UncannyMelting>(),
            }, new Random());

            // Given: saving state
            var memento = deck.SaveToMemento();

            //   And: draw first 4 cards
            string originalFirstFourCards = deck.Flip(4).Select(c => c.Name).Join(",");

            //   And: draw some more we don't care about
            deck.Flip(4);

            //  When: restore state using memento
            deck.RestoreFrom(memento);

            //  Then: first 4 cards should be the same
            deck.Flip(4).Select(c => c.Name).Join(",").ShouldBe(originalFirstFourCards);
        }
示例#13
0
    public HeartOfTheWildfire() : base(
            new BlazingPresence()
            , PowerCard.For <AsphyxiatingSmoke>()
            , PowerCard.For <FlashFires>()
            , PowerCard.For <ThreateningFlames>()
            , PowerCard.For <FlamesFury>()
            )
    {
        (Presence as BlazingPresence).spirit = this;
        InnatePowers = new InnatePower[] {
            InnatePower.For <FireStorm>(),
            InnatePower.For <TheBurnedLandRegrows>()
        };


        Growth = new(
            new GrowthOption(
                new ReclaimAll(),
                new DrawPowerCard(1),
                new GainEnergy(1)
                ),
            new GrowthOption(
                new DrawPowerCard(1),
                new PlacePresence(3)
                ),
            new GrowthOption(
                new PlacePresence(1),
                new GainEnergy(2),
                new EnergyForFire()
                )
            );
    }
示例#14
0
        static public (VirtualTestUser, SelfCtx) SetupGame(
            PowerCard powerCard,
            Action <GameState> modGameState = null
            )
        {
            var spirit = new TestSpirit(powerCard);
            var gs     = new GameState(spirit, Board.BuildBoardA())
            {
                InvaderDeck = new InvaderDeck(null)                   // Same order every time
            };

            modGameState?.Invoke(gs);

            _ = new SinglePlayer.SinglePlayerGame(gs);

            var user       = new VirtualTestUser(spirit);
            var starterCtx = spirit.Bind(gs);

            // Disable destroying presence
            // starterCtx.GameState.AddBlightSideEffect = (gs,space) => new AddBlightEffect { Cascade=false,DestroyPresence=false };
            starterCtx.GameState.ModifyBlightAddedEffect.ForGame.Add(x => { x.Cascade = false; x.DestroyPresence = false; });


            return(user, starterCtx);
        }
示例#15
0
    public VolcanoLoomingHigh() : base(
            new VolcanoPresence(
                new PresenceTrack(Track.Energy1, Track.Energy2, Track.EarthEnergy, Track.Energy3, Track.Energy4, Track.Energy5),
                new PresenceTrack(Track.Card1, Track.MkCard(Element.Fire), Track.MkCard(Element.Earth), Track.Card2, Track.MkCard(Element.Air), Track.Card3, Track.MkCard(Element.Fire), Track.Card4)
                )
            , PowerCard.For <ExaltationOfMoltenStone>()
            , PowerCard.For <LavaFlows>()
            , PowerCard.For <PyroclasticBombardment>()
            , PowerCard.For <RainOfAsh>()
            )
    {
        Growth = new Growth(
            new GrowthOption(new ReclaimAll(), new DrawPowerCard(), new GainEnergy(3)),
            new GrowthOption(new PlacePresence(0, Target.Mountain), new PlacePresence(0, Target.Mountain)),
            new GrowthOption(new DrawPowerCard(), new PlacePresence(4, Target.Mountain), new PlayExtraCardThisTurn(1), new GainEnergy(2))
            );

        InnatePowers = new InnatePower[] {
            InnatePower.For <ExplosiveEruption>(),
            InnatePower.For <PoweredByTheFurnaceOfTheEarth>()
        };

        ((VolcanoPresence)(Presence)).SetSpirit(this);

        RangeCalc = new VolcanoTargetLandApi();
    }
示例#16
0
    public Thunderspeaker() : base(
            new SpiritPresence(
                new PresenceTrack(Track.Energy1, Track.AirEnergy, Track.Energy2, Track.FireEnergy, Track.SunEnergy, Track.Energy3),
                new PresenceTrack(Track.Card1, Track.Card2, Track.Card2, Track.Card3, Track.CardReclaim1, Track.Card3, Track.Card4)
                ),
            PowerCard.For <ManifestationOfPowerAndGlory>(),
            PowerCard.For <SuddenAmbush>(),
            PowerCard.For <VoiceOfThunder>(),
            PowerCard.For <WordsOfWarning>()
            )
    {
        Growth = new(
            new GrowthOption(
                new ReclaimAll(),
                new DrawPowerCard(1),
                new DrawPowerCard(1)
                ),
            new GrowthOption(
                new PlacePresence(2, Target.Dahan),
                new PlacePresence(1, Target.Dahan)
                ),
            new GrowthOption(
                new PlacePresence(1),
                new GainEnergy(4)
                )
            );

        this.InnatePowers = new InnatePower[] {
            InnatePower.For <GatherTheWarriors>(),
            InnatePower.For <LeadTheFuriousAssult>(),
        };
    }
示例#17
0
    public RiverSurges() : base(
            new RiverPresence(
                new PresenceTrack(Track.Energy1, Track.Energy2, Track.Energy2, Track.Energy3, Track.Energy4, Track.Energy4, Track.Energy5),
                new PresenceTrack(Track.Card1, Track.Card2, Track.Card2, Track.Card3, Track.CardReclaim1, Track.Card4, Track.Card5)
                ),
            PowerCard.For <BoonOfVigor>(),
            PowerCard.For <FlashFloods>(),
            PowerCard.For <RiversBounty>(),
            PowerCard.For <WashAway>()
            )
    {
        Growth = new(
            new GrowthOption(
                new ReclaimAll(),
                new DrawPowerCard(1),
                new GainEnergy(1)
                ),
            new GrowthOption(
                new PlacePresence(1),
                new PlacePresence(1)
                ),
            new GrowthOption(
                new DrawPowerCard(1),
                new PlacePresence(2)
                )
            );

        InnatePowers = new InnatePower[] {
            InnatePower.For <MassiveFlooding>()
        };
    }
示例#18
0
        public void SingleBuild(bool playsCard, string result)
        {
            var(user, ctx) = TestSpirit.SetupGame(PowerCard.For <RitesOfTheLandsRejection>());

            // Given: find a space with 1 explorer
            var spaceCtx = ctx.AllSpaces
                           .Select(ctx.Target)
                           .First(sc => sc.Tokens.InvaderSummary() == "1E@1");

            //   And: add Dahan (because card requires it)
            spaceCtx.Dahan.Init(1);

            // When: growing
            user.Grows();

            //  And: purchase test card
            user.PlaysCard(RitesOfTheLandsRejection.Name);
            if (playsCard)
            {
                user.SelectsFastAction(RitesOfTheLandsRejection.Name);
                user.TargetsLand_IgnoreOptions(spaceCtx.Space.Label);
                user.AssertDecisionX("Select Power Option", "{Stop build - 1 fear / (Dahan or T/C)},Push up to 3 dahan", "{}");
            }
            else
            {
                //  And: done with fast (no more cards..)
                user.IsDoneWith(Phase.Fast);
            }

            // Then: space should have a building
            System.Threading.Thread.Sleep(10);
            spaceCtx.Tokens.InvaderSummary().ShouldBe(result);
        }
示例#19
0
    public ManyMindsMoveAsOne()
        : base(
            new ManyMindsPresence(
                new PresenceTrack(Track.Energy0, Track.Energy1, Track.MkEnergy(Element.Air), Track.Energy2, Track.MkEnergy(Element.Animal), Track.Energy3, Track.Energy4),
                new PresenceTrack(Track.Card1, Track.Card2, CardBoost, Track.Card3, Track.Card3, Track.Card4, Track.Card5)
                )
            , PowerCard.For <ADreadfulTideOfScurryingFlesh>()
            , PowerCard.For <BoonOfSwarmingBedevilment>()
            , PowerCard.For <EverMultiplyingSwarm>()
            , PowerCard.For <GuideTheWayOnFeatheredWings>()
            , PowerCard.For <PursueWithScratchesPecksAndStings>()
            )
    {
        // Growth
        Growth = new Growth(
            new GrowthOption(new ReclaimAll(), new DrawPowerCard()),
            new GrowthOption(new PlacePresence(1), new PlacePresence(0)),
            new GrowthOption(new PlacePresenceAndBeast(), new GainEnergy(1), new Gather1Beast())
            );

        // Innates
        InnatePowers = new InnatePower[] {
            InnatePower.For <TheTeemingHostArrives>(),
            InnatePower.For <BesetAndConfoundTheInvaders>()
        };
    }
示例#20
0
    public void ReturningKeeperPresence_PushesDahan()
    {
        var fix = new ConfigurableTestFixture {
            Spirit = new Keeper()
        };
        var space            = fix.Board[5];
        var dahanDestination = space.Adjacent.First();

        // Given: Keeper has a destroyed presence
        fix.Spirit.Presence.Destroyed = 1;

        //   And: a presence on target space.
        fix.Spirit.Presence.Adjust(space, 1);

        //   And: Dahan on space
        fix.InitTokens(space, "1D@2");

        //  When: play the card
        var task = PowerCard.For <SkiesHeraldTheSeasonOfReturn>().ActivateAsync(fix.SelfCtx);

        // target space
        fix.Choose(space);

        // Then: Should Push Dahan (per keeper's Sacred Site)
        fix.Choose("D@2");
        fix.Choose(dahanDestination);
        //  And: May Gather up to 2 dahan (per the card)
        fix.Choose("D@2 on " + dahanDestination.Text);         // "Gather up to 2 Dahan"
        //  And: May push 1 blight
        // no blight to push

        task.IsCompletedSuccessfully.ShouldBeTrue();
    }
    /// <summary>
    /// If in hand, allows discarding instead of forgetting.
    /// </summary>
    public override void Forget(PowerCard card)
    {
        // (Source-1) Purchased / Active
        if (InPlay.Contains(card))
        {
            foreach (var el in card.Elements)
            {
                Elements[el.Key] -= el.Value;                                       // lose elements from forgotten card
            }
            InPlay.Remove(card);
            DiscardPile.Add(card);
            return;
        }

        if (Hand.Contains(card))
        {
            Hand.Remove(card);
            DiscardPile.Add(card);
            return;
        }

        if (DiscardPile.Contains(card))
        {
            base.Forget(card);
            return;
        }

        throw new System.Exception("Can't find card to forget:" + card.Name);
    }
示例#22
0
    public ASpreadOfRampantGreen() : base(
            new RampantGreenPresence(),
            PowerCard.For <FieldsChokedWithGrowth>(),
            PowerCard.For <GiftOfProliferation>(),
            PowerCard.For <OvergrowInANight>(),
            PowerCard.For <StemTheFlowOfFreshWater>()
            )
    {
        // Special rules: steady regeneration

        Growth = new Growth(
            new GrowthOption(new PlacePresence(2, Target.JungleOrWetland))
            ).Add(new GrowthOptionGroup(1,
                                        // reclaim, +1 power card
                                        new GrowthOption(
                                            new ReclaimAll(),
                                            new DrawPowerCard(1)
                                            ),
                                        // +1 presense range 1, play +1 extra card this turn
                                        new GrowthOption(
                                            new PlacePresence(1),
                                            new PlayExtraCardThisTurn(1)
                                            ),
                                        // +1 power card, +3 energy
                                        new GrowthOption(
                                            new GainEnergy(3),
                                            new DrawPowerCard()
                                            )
                                        ));

        this.InnatePowers = new InnatePower[] {
            InnatePower.For <CreepersTearIntoMortar>(),
            InnatePower.For <AllEnvelopingGreen>(),
        };
    }
示例#23
0
    public async Task Repeat_BadlandsWorksOnBothTargets()
    {
        var fix    = new ConfigurableTestFixture();
        var space1 = fix.Board[3];
        var space2 = fix.Board[8];

        // Given: 2 sun, 3 fire, 3 earth
        fix.InitElements("2 sun,3 fire,3 earth");

        //  And: target land #1 has 1 presence, 3 explorers and 1 town
        fix.InitPresence(space1, 1);
        fix.InitTokens(space1, "3E@1,1T@2");

        //  And: target land #2 has the same (1 presence, 3 explorers and 1 town)
        fix.InitPresence(space2, 1);
        fix.InitTokens(space2, "3E@1,1T@2");

        // When: play card
        var task = PowerCard.For <ForestsOfLivingObsidian>().ActivateAsync(fix.SelfCtx);

        //  And: targeting space 1
        fix.Choose(space1);
        fix.Choose("T@1");         // Damage (1 remaining)

        //  And: targeting space 2
        fix.Choose(space2);
        fix.Choose("T@1");           // Damage (1 remaining)

        task.IsCompletedSuccessfully.ShouldBeTrue();
    }
示例#24
0
        public void IsFastAndCost1()
        {
            var suddenAmbush = PowerCard.For <SuddenAmbush>();

            suddenAmbush.DisplaySpeed.ShouldBe(Phase.Fast);
            suddenAmbush.Cost.ShouldBe(2);
        }
示例#25
0
    public SharpFangs() : base(
            new SpiritPresence(
                new PresenceTrack(Track.Energy1, Track.AnimalEnergy, Track.PlantEnergy, Track.Energy2, Track.AnimalEnergy, Track.Energy3, Track.Energy4),
                new PresenceTrack(Track.Card2, Track.Card2, Track.Card3, Track.CardReclaim1, Track.Card4, Track.Card5Reclaim1)
                ),
            PowerCard.For <PreyOnTheBuilders>(),
            PowerCard.For <TeethGleamFromDarkness>(),
            PowerCard.For <TerrifyingChase>(),
            PowerCard.For <TooNearTheJungle>()
            )
    {
        var beastOrJungleRange3 = new PlacePresence(3, Target.BeastOrJungle);

        Growth = new Growth(2,
                            new GrowthOption(new ReclaimAll(), new GainEnergy(-1), new DrawPowerCard(1))
        {
            GainEnergy = -1
        },
                            new GrowthOption(beastOrJungleRange3),
                            new GrowthOption(new DrawPowerCard(1), new GainEnergy(1))
        {
            GainEnergy = 1
        },
                            new GrowthOption(new GainEnergy(3))
        {
            GainEnergy = 3
        }
                            );

        this.InnatePowers = new InnatePower[] {
            InnatePower.For <FrenziedAssult>(),
            InnatePower.For <RagingHunt>(),
        };
    }
示例#26
0
        public void Replaying_FastCards()
        {
            // Given: Earth has enough elements to trigger GOS
            User.SelectsGrowthA_Reclaim_PP2();
            spirit.Elements[Element.Sun]   = 1;
            spirit.Elements[Element.Earth] = 2;
            spirit.Elements[Element.Plant] = 2;

            //  And: Earth has 4 cards
            var cards = new PowerCard[] {
                MakePowerCard(Slow0),                   // not played
                MakePowerCard(Fast0),                   // not played
                MakePowerCard(Fast1),                   // played - should appear
                MakePowerCard(Fast2)                    // played - no - too expensive
            };

            spirit.tempCardPlayBoost = cards.Length;
            spirit.Hand.AddRange(cards);
            PlayCards(cards);
            User.IsDoneBuyingCards();

            //  And: already played 2 fast cards (cost 1 & 2)
            User.SelectsFastAction("Fast-0,(Fast-1),Fast-2,Gift of Strength");
            User.SelectsFastAction("Fast-0,(Fast-2),Gift of Strength");

            User_PlaysGiftOfStrengthOnSelf();

            // Then: user can replay ONLY the played: Fast-1 card.
            User.SelectsFastAction("Fast-0,(Replay Card [max cost:1])");
            User.AssertDecision("Select card to replay", "Fast-1 $1 (Fast)", "Fast-1 $1 (Fast)");               // !!! should there be a ,Done here?
        }
    public void ShowAllChoosePoints(Pawn _owner, PowerCard _powerCard)
    {
        m_closeButton.onClick.RemoveAllListeners();
        m_closeButton.onClick.AddListener(() => {
            gameObject.SetActive(false);
        });
        gameObject.SetActive(true);
        if (_powerCard.m_powerType == PowerTypes.LongitudeMaster || _powerCard.m_powerType == PowerTypes.PosX_NegX || _powerCard.m_powerType == PowerTypes.ThreePoints)
        {
            return;
        }
        m_chooseText.text = "";
        if (_powerCard.m_powerType == PowerTypes.GMTMaster)
        {
            m_chooseText.text = "Choose GMT time as strategy";
        }
        else if (_powerCard.m_powerType == PowerTypes.Master)
        {
            m_chooseText.text = "Choose GMT Point where you want to jump";
        }

        foreach (var _value in m_values)
        {
            DestroyImmediate(_value.gameObject);
        }

        m_values.Clear();

        for (int i = 1; i <= GameplayManager.r_TotalLongitude; i++)
        {
            Value _value = Instantiate(m_choosePointPrefab, m_choosePointContainer);
            _value.UpdateValue(_owner, _powerCard, i);
            m_values.Add(_value);
        }
    }
示例#28
0
 public void OnPowerCardPlayed(Pawn _owner, PowerCard _playedPowerCard, int _value)
 {
     m_powerCardGMTOrLongValue = _value;
     m_pickCardView.ObscurePickCardView(false);
     m_pickCardView.UpdatePickCardView(_owner, _playedPowerCard);
     GameplayCanvasManager.m_Instance.ShowGameplayCanvasMenu(GameplayCanvasMenu.PickCardPanel);
 }
示例#29
0
    public void purchaseCard(PowerCard card)
    {
        Energy e = player.GetComponent <Energy>();

        if (card.getCost() > e.getEnergy())
        {
            Debug.Log("You do not have enough Energy to purchase this card.");
        }
        else
        {
            e.removeEnergy(card.getCost());
            playerHand.Add(card);
            stock.Remove(card);
            if (card.getType().Equals("Discard"))
            {
                card.executeCard();
                playerHand.Remove(card);
            }

            if (deck.Count >= 1)
            {
                stock.Add(deck[0]);
            }
            else
            {
                Debug.Log("The deck is empty!");
            }
        }
    }
示例#30
0
    public LightningsSwiftStrike() : base(
            new SpiritPresence(
                new PresenceTrack(Track.Energy1, Track.Energy1, Track.Energy2, Track.Energy2, Track.Energy3, Track.Energy4, Track.Energy4, Track.Energy5),
                new PresenceTrack(Track.Card2, Track.Card3, Track.Card4, Track.Card5, Track.Card6)
                ),
            PowerCard.For <HarbingersOfTheLightning>(),
            PowerCard.For <LightningsBoon>(),
            PowerCard.For <RagingStorm>(),
            PowerCard.For <ShatterHomesteads>()
            )
    {
        Growth = new(
            new GrowthOption(
                new ReclaimAll(),
                new DrawPowerCard(1),
                new GainEnergy(1)
                ),
            // +1 presence range 2, +1 presence range 0(
            new GrowthOption(
                new PlacePresence(2),
                new PlacePresence(0)
                ),
            // +1 presense range 1, +3 energy
            new GrowthOption(new GainEnergy(3), new PlacePresence(1))
            );

        this.InnatePowers = new InnatePower[] {
            InnatePower.For <ThunderingDestruction>()
        };
    }
示例#31
0
        private static void LoadOverlordCards(Game game)
        {
            StreamReader reader = new StreamReader(TitleContainer.OpenStream("overlordcards.txt"));
            overlordCards = new List<OverlordCard>();

            int n = int.Parse(reader.ReadLine());
            for (int i = 0; i < n; i++)
            {
                string line = reader.ReadLine();
                if (line.StartsWith("//")) continue;
                OverlordCard card = null;

                string[] data = line.Split(new char[] { ',' }, 9);

                int id = int.Parse(data[0]);
                string type = data[1];
                string name = data[2];
                int amount = int.Parse(data[3]);
                int cost = int.Parse(data[4]);
                int sell = int.Parse(data[5]);
                string description = data[7];

                switch (type)
                {
                    case "Spawn":
                        List<Monster> monsters = new List<Monster>();
                        string[] creaturesToSpawn = data[6].Split('/');
                        for (int j = 0; j < creaturesToSpawn.Length; j++)
                        {
                            for (int k = 0; k < int.Parse(creaturesToSpawn[j].Split(' ')[1]); k++)
                            {
                                monsters.Add(GetMonster(int.Parse(creaturesToSpawn[j].Split(' ')[0])));
                            }
                        }
                        card = new SpawnCard(id, name, description, cost, sell, monsters.ToArray());
                        break;
                    case "Power":
                        card = new PowerCard(id, name, description, cost, sell);
                        break;
                    case "Trap":
                        card = new TrapCard(id, name, description, cost, sell);
                        break;
                    case "Event":
                        card = new EventCard(id, name, description, cost, sell);
                        break;
                }
                if (card != null)
                    overlordCards.Add(card);
            }
        }