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");
        }
Beispiel #2
0
        static public InvaderDeck MountainThenAllSands()
        {
            var sand = new InvaderCard(Terrain.Sand);

            return(InvaderDeck.BuildTestDeck(
                       new InvaderCard(Terrain.Mountain),            // initial explorer in mountains
                       sand, sand, sand, sand, sand
                       ));
        }
Beispiel #3
0
        public Task Initialize(GameSettings settings)
        {
            return(Task.Run(() =>
            {
                foreach (var boardId in settings.BoardIds)
                {
                    _boards.Add(_boardRepository.Get(boardId));
                }

                InvaderDeck = _invaderDeckFactory.Create(_invaderDeckOrder);
            }));
        }
    public MassiveFlooding_Tests() : base()
    {
        // Given: River
        spirit.UsePowerProgression();
        gs = new GameState(spirit, Board.BuildBoardA())
        {
            InvaderDeck = InvaderDeck.Unshuffled(),
            Phase       = Phase.Slow
        };

        game = new SinglePlayerGame(gs);
    }
Beispiel #5
0
        public void StopsAllInvaderActions()
        {
            List <string> invaderLog = new List <string>();

            var(user, ctx) = TestSpirit.SetupGame(PowerCard.For <IndomitableClaim>(), (gs) => {
                var jungleCard  = new InvaderCard(Terrain.Jungle);
                gs.InvaderDeck  = InvaderDeck.BuildTestDeck(jungleCard, jungleCard, jungleCard, jungleCard);
                gs.NewLogEntry += (s) => invaderLog.Add(s.Msg());
            });

            // Given: there a ravage card
            user.Grows();
            user.IsDoneBuyingCards();
            invaderLog.Clear();

            // and: there is a space that IS-RAVAGE AND BUILD (aka: Jungle - see above)
            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: we have a presence in that land
            ctx.Self.Presence.PlaceOn(spaceCtx.Space, spaceCtx.GameState);

            //  And: it has 3 explorers
            spaceCtx.Tokens.InitDefault(Invader.Explorer, 3);
            spaceCtx.Tokens.InitDefault(Invader.Town, 0);
            spaceCtx.Tokens.InitDefault(Invader.City, 0);               // if we had to advance cards, might have buit a city
            spaceCtx.Tokens.InvaderSummary().ShouldBe("3E@1", "Unable to init to 3 exploreres.");
            //  And 2 dahan
            spaceCtx.Dahan.Init(2);

            // When: grows and purchases card
            user.Grows();
            user.PlaysCard(IndomitableClaim.Name);

            //  And: has enough elements to trigger the bonus
            ctx.Self.Elements[Element.Sun]   = 2;
            ctx.Self.Elements[Element.Earth] = 3;

            //  When: Activates Card
            user.SelectsFastAction(IndomitableClaim.Name);
            user.TargetsLand_IgnoreOptions(spaceCtx.Space.Label);
            user.PullsPresenceFromTrack(ctx.Self.Presence.Energy.RevealOptions.Single());

            // Then: nothing changed
            spaceCtx.Tokens.InvaderSummary().ShouldBe("3E@1", "should be same that we started with");

            // Make sure that we actually executed the Ravage Build / Explore Bit
            invaderLog.Count(s => s.Contains("Exploring")).ShouldBeGreaterThan(0);
        }
Beispiel #6
0
    /// <summary>
    /// Called AFTER everything has been configured. and BEFORE players make first move.
    /// </summary>
    public void Initialize()
    {
        // ! this has to go first since ManyMinds requires the beast to be in place
        foreach (var board in Island.Boards)
        {
            Tokens[board[2]].Disease.Init(1);
            var lowest = board.Spaces.Skip(1).OfType <Space1>().First(s => s.StartUpCounts.Empty);
            Tokens[lowest].Beasts.Adjust(1);
        }

        foreach (var board in Island.Boards)
        {
            foreach (var space in board.Spaces)
            {
                ((Space1)space).InitTokens(Tokens[space]);
            }
        }

        // Explore
        InvaderDeck.Explore[0].Explore(this).Wait();

        InvaderDeck.Advance();

        InitSpirits();

        // Blight
        BlightCard.OnGameStart(this);
        Tokens.TokenAdded.ForGame.Add(async args => {
            if (args.Token == TokenType.Blight)
            {
                await BlightAdded(args);
            }
        });
        Tokens.TokenRemoved.ForGame.Add(args => {
            if (args.Token == TokenType.Blight &&
                !args.Reason.IsOneOf(
                    RemoveReason.MovedFrom,                     // pushing / gathering blight
                    RemoveReason.Replaced                       // just in case...
                    )
                )
            {
                this.blightOnCard += args.Count;
            }
        });
    }
Beispiel #7
0
        public void Memento_RoundTrip()
        {
            // Given: a deck in some advanced state
            var sut = new InvaderDeck(new System.Random());

            Advance(sut);

            //   And: we have saved the desired state
            var    memento  = sut.SaveToMemento();
            string expected = TakeSnapShot(sut);

            //   And: advanced beyond the saved state
            Advance(sut);

            //  When: we restore the saved state
            sut.LoadFrom(memento);

            // Then: we should get back the expted state
            TakeSnapShot(sut).ShouldBe(expected);
        }
Beispiel #8
0
        public Quarantine_Tests()
        {
            var powerCard = PowerCard.For <CallToTend>();

            var(userLocal, ctxLocal) = TestSpirit.SetupGame(powerCard, gs => {
                gs.NewLogEntry += (s) => { if (s is InvaderActionEntry)
                                           {
                                               log.Enqueue(s.Msg());
                                           }
                };
                gs.InvaderDeck = InvaderDeck.BuildTestDeck(
                    new InvaderCard(Terrain.Sand),                     // not on coast
                    InvaderCard.Stage2Costal(),
                    new InvaderCard(Terrain.Jungle)
                    );
            });
            user = userLocal;
            ctx  = ctxLocal;
            log.Clear();             // skip over initial Explorer setup
        }
        private void SetUpSweden(int level)
        {
            if (level == 0 || level == 1)
            {
                CreateFearDeck();
                SetUpFearCards(3, 3, 3);
            }
            else if (level == 2)
            {
                CreateFearDeck(10);
                SetUpFearCards(3, 4, 3);
            }
            else if (level == 3)
            {
                CreateFearDeck(10);
                SetUpFearCards(3, 4, 3);
            }
            else if (level == 4)
            {
                CreateFearDeck(11);
                SetUpFearCards(3, 4, 4);
            }
            else if (level == 5)
            {
                CreateFearDeck(12);
                SetUpFearCards(4, 4, 4);
            }
            else if (level == 6)
            {
                CreateFearDeck(13);
                SetUpFearCards(4, 4, 5);
            }

            if (level >= 4)
            {
                InvaderBox.Add(InvaderDeck[0]);
                InvaderDeck.RemoveAt(0);
            }
        }
Beispiel #10
0
        /// <summary> Replaces all Invader Cards with null-cards that don't ravage/build/explore</summary>
        static public void DisableInvaderDeck(this GameState gs)
        {
            var nullCard = new InvaderCard(Terrain.None);

            gs.InvaderDeck = InvaderDeck.BuildTestDeck(new byte[12].Select(_ => nullCard).ToArray());
        }
Beispiel #11
0
 static string TakeSnapShot(InvaderDeck sut)
 {
     //   And: record cards
     return(sut.Ravage[0].Text + " : " + sut.Build[0].Text + " : " + sut.Explore[0].Text);
 }
Beispiel #12
0
 static void Advance(InvaderDeck sut)
 {
     sut.Advance();
     sut.Advance();
     sut.Advance();
 }
        private void CreateInvaderDeck()
        {
            InvaderBox.Clear();
            InvaderDeck.Clear();

            // construct and initialize all Invader cards by Phase
            for (int i = 1; i <= 4; i++)
            {
                String      backPath = "assets/cards/invader/cards-invader-00.png";
                ImageSource back     = new BitmapImage(new Uri(backPath, UriKind.Relative));

                String      s         = "0" + i.ToString();
                String      frontPath = "assets/cards/invader/cards-invader-" + s + ".png";
                ImageSource front     = new BitmapImage(new Uri(frontPath, UriKind.Relative));

                InvaderCard ic = new InvaderCard(i, 1, front, back);
                InvaderDeck.Add(ic);
            }
            InvaderDeck.Shuffle();

            InvaderBox.Add(InvaderDeck[0]);
            InvaderDeck.RemoveAt(0);

            ObservableCollection <InvaderCard> phase2 = new ObservableCollection <InvaderCard>();

            for (int i = 6; i <= 10; i++)
            {
                String      backPath = "assets/cards/invader/cards-invader-05.png";
                ImageSource back     = new BitmapImage(new Uri(backPath, UriKind.Relative));

                String s = "";
                if (i < 10)
                {
                    s = "0" + i.ToString();
                }
                else
                {
                    s = i.ToString();
                }
                String      frontPath = "assets/cards/invader/cards-invader-" + s + ".png";
                ImageSource front     = new BitmapImage(new Uri(frontPath, UriKind.Relative));

                InvaderCard ic = new InvaderCard(i, 2, front, back);
                phase2.Add(ic);
            }
            phase2.Shuffle();

            InvaderBox.Add(phase2[0]);
            phase2.RemoveAt(0);

            foreach (InvaderCard c in phase2)
            {
                InvaderDeck.Add(c);
            }

            ObservableCollection <InvaderCard> phase3 = new ObservableCollection <InvaderCard>();

            for (int i = 12; i <= 17; i++)
            {
                String      backPath = "assets/cards/invader/cards-invader-11.png";
                ImageSource back     = new BitmapImage(new Uri(backPath, UriKind.Relative));

                String      s         = i.ToString();
                String      frontPath = "assets/cards/invader/cards-invader-" + s + ".png";
                ImageSource front     = new BitmapImage(new Uri(frontPath, UriKind.Relative));

                InvaderCard ic = new InvaderCard(i, 3, front, back);
                phase3.Add(ic);
            }
            phase3.Shuffle();

            InvaderBox.Add(phase3[0]);
            phase3.RemoveAt(0);

            foreach (InvaderCard c in phase3)
            {
                InvaderDeck.Add(c);
            }
        }
        private void SetUpBrandenburgPrussia(int level)
        {
            if (level == 0 || level == 1 || level == 2)
            {
                CreateFearDeck();
                SetUpFearCards(3, 3, 3);
            }

            if (level == 2)
            {
                InvaderDeck.Move(InvaderDeck.Count - 1, 3);
            }
            else if (level == 3)
            {
                CreateFearDeck(10);
                SetUpFearCards(3, 4, 3);

                InvaderDeck.Move(InvaderDeck.Count - 1, 3);
                InvaderBox.Add(InvaderDeck[0]);
                InvaderDeck.RemoveAt(0);
            }
            else if (level == 4)
            {
                CreateFearDeck(11);
                SetUpFearCards(4, 4, 3);

                InvaderDeck.Move(InvaderDeck.Count - 1, 3);
                InvaderBox.Add(InvaderDeck[0]);
                InvaderDeck.RemoveAt(0);
                InvaderBox.Add(InvaderDeck[3]);
                InvaderDeck.RemoveAt(3);
            }
            else if (level == 5)
            {
                CreateFearDeck(11);
                SetUpFearCards(4, 4, 3);

                InvaderDeck.Move(InvaderDeck.Count - 1, 3);
                InvaderBox.Add(InvaderDeck[0]);
                InvaderDeck.RemoveAt(0);
                InvaderBox.Add(InvaderDeck[3]);
                InvaderDeck.RemoveAt(3);
                InvaderBox.Add(InvaderDeck[0]);
                InvaderDeck.RemoveAt(0);
            }
            else if (level == 6)
            {
                CreateFearDeck(12);
                SetUpFearCards(4, 4, 4);

                InvaderDeck.Move(InvaderDeck.Count - 1, 3);
                InvaderBox.Add(InvaderDeck[0]);
                InvaderDeck.RemoveAt(0);
                InvaderBox.Add(InvaderDeck[3]);
                InvaderDeck.RemoveAt(3);
                InvaderBox.Add(InvaderDeck[0]);
                InvaderDeck.RemoveAt(0);
                InvaderBox.Add(InvaderDeck[0]);
                InvaderDeck.RemoveAt(0);
            }
        }