示例#1
0
 public SlayerPlayer(SlayerDeck deck, ISlayerGameController controller)
 {
     Hand       = new List <BaseCard>();
     Party      = new List <SlayerRecruit>();
     Artifacts  = new List <SlayerArtifact>();
     Deck       = deck;
     Controller = controller;
 }
示例#2
0
        public void CheckSlayerDeck()
        {
            var d = new SlayerDeck();

            d.AllCards.Count.Should().Be(35);
            d.Deck.Count.Should().Be(35);
            d.Discard.Should().BeEmpty();
            d.AllCards.Count(_ => _.CardAction == ECardAction.None).Should().Be(0);
        }
示例#3
0
        public Game(IDragonGameController dragonPlayer, ISlayerGameController slayerPlayer)
        {
            DragonDeck = new DragonDeck();
            SlayerDeck = new SlayerDeck();

            Dragon = new DragonPlayer(DragonDeck, dragonPlayer);
            Slayer = new SlayerPlayer(SlayerDeck, slayerPlayer);
            Slayer.RandomPresetParty();
        }
示例#4
0
        private void DrawCards()
        {
            /* DRAW PHASE
             *  The Slayer player draws 3 cards from the Slayer Deck.
             *  The Dragon player draws 3 cards from the Dragon Deck.
             *  If a deck runs out shuffle the discard and draw from it.
             *  Maximum hand size is 7 cards. Discard excess cards.
             */

            SlayerDeck.DrawFromDeck(_slayerDrawsLess ? ReducedDrawNumber : NormalDrawNumber, Slayer.Hand, DiscardExtraSlayer);
            SlayerCheckArtifacts();

            DragonDeck.DrawFromDeck(_dragonDrawsLess ? ReducedDrawNumber : NormalDrawNumber, Dragon.Hand, DiscardExtraDragon);
        }
示例#5
0
        private void PlaySlayer()
        {
            /* SLAYER PHASE
             *  The party may attack the Dragon.
             *  To make an attack, an attack card must be discarded from the players hand.
             *  The party may make multiple attacks.
             *  There must also be one party member alive who can make the attack.
             *  For example:  To make a spell attack the party must have at least one Wizard.
             *  Both Warriors & Men-at-Arms may make Sword Attacks.
             *  A party member may make only one attack per turn.
             *  For example:  If you have 2 Wizards you could make 2 spell attacks per turn.
             *  Each attack does a base of 1 point of damage to the Dragon.
             *  Some cards indicate they do a base 2 points of damage.
             *  Warriors inflict an additional point of damage when they attack.
             *  Some artifacts increase the amount of damage done by an attack.
             *  The Dragon player may block an attack by discarding a Blocking
             *  Card that targets the attack type.
             *  For example: The Dragon player may discard a ‘Magic Resistance’ card to
             *  negate a spell attack.
             */

            BaseCard playCard;

            do
            {
                GameMessage("Please choose a card to play...");
                playCard = GetSlayerPlayCard();
                var usedMembers = new List <SlayerRecruit>();

                if (playCard == null)
                {
                    GameMessage("Ok, your turn is over.");
                    break;
                }

                switch (playCard.CardAction)
                {
                case ECardAction.Attack:
                    var playMember = GetSlayerAttackMember();
                    if (playMember == null)
                    {
                        GameMessage("Sorry, you have to choose a member to attack with! Please try again...");
                        continue;
                    }
                    if (usedMembers.Contains(playMember))
                    {
                        GameMessage("Sorry, you've already attacked with that member! Please choose again...");
                        continue;
                    }

                    if (!playMember.CanAttackWith(playCard))
                    {
                        GameMessage("Sorry, this member can't attack like that! Please choose again...");
                        continue;
                    }

                    usedMembers.Add(playMember);

                    var blockingCard = GetDragonBlockingCard();
                    if (blockingCard == null)
                    {
                        // Damage Applied!
                        Dragon.DamageDragon(playCard, playMember);
                        GameMessage("You successfully attacked the Dragon! Do you want to play another card?");
                    }
                    else
                    {
                        // Damage Blocked!
                        DragonDeck.DiscardCard(blockingCard, Dragon.Hand);
                        GameMessage("Sorry, the Dragon blocked your attack. Do you want to play another card?");
                    }

                    // Magic Scrolls don't discard the attack card
                    if (playMember.Artifact != null && playMember.Artifact.Type == EArtifactType.MagicScrolls)
                    {
                        continue;
                    }

                    SlayerDeck.DiscardCard(playCard, Slayer.Hand);
                    break;

                case ECardAction.DiscardToDraw:
                    SlayerDeck.DiscardCard(playCard, Slayer.Hand);
                    SlayerDeck.DrawFromDeck(_slayerDrawsLess ? ReducedDrawNumber : NormalDrawNumber, Slayer.Hand, DiscardExtraSlayer);
                    GameMessage("You have drawn more cards. Do you want to play another card?");
                    break;

                case ECardAction.EnemyDrawsLess:
                    SlayerDeck.DiscardCard(playCard, Slayer.Hand);
                    _dragonDrawsLess = true;
                    GameMessage("You have hindered the Dragon's next draw. Do you want to play another card?");
                    break;

                case ECardAction.Regenerate:
                    var reviveMember = GetSlayerReviveMember();

                    if (reviveMember == null)
                    {
                        GameMessage("No party members revived. Do you want to play another card?");
                        continue;
                    }

                    if (Slayer.Dead.Count > 0)
                    {
                        SlayerDeck.DiscardCard(playCard, Slayer.Hand);
                        Slayer.Dead.Remove(reviveMember);
                        Slayer.Party.Add(reviveMember);
                        GameMessage("You have revived a party member. Do you want to play another card?");
                    }
                    else
                    {
                        GameMessage("You have no party members to revive! Do you want to play another card?");
                    }
                    break;
                }

                if (Dragon.HitPoints <= 0)
                {
                    // YOU WIN!
                    GameMessage("Well done, you have defeated the Dragon!");
                    GameOver(Slayer);
                }
            } while (playCard != null);
        }
示例#6
0
        private void PlayDragon()
        {
            /* DRAGON PHASE
             *  The Dragon may attack the party.
             *  To make an attack, an attack card must be discarded from the players hand.
             *  The Dragon may make multiple attacks.
             *  The Dragon may only use one attack type once per turn.
             *  For example: The Dragon may not make 2 Firebreath attacks in one turn.
             *  The Dragon may only use one body part to make one attack type once per turn.
             *  For example: The Bite and Firebreath attacks are both ‘Mouth’ attacks so
             *  only one may be used.
             *  The Slayer player may block an attack by discarding a Blocking Card that
             *  matches the target type.
             *  For example: The Slayer may discard a ‘Shield’ card to negate an attack vs a
             *  Warrior or a Man-at-Arms.
             *  Each attack targets one party member.
             *  Dragons must attack Men-at-Arms first.
             *  After all the Men-at-Arms are killed the Dragon may attack Warriors next.
             *  After all the Warriors are killed the Dragon may attack Archers & Wizards.
             */

            var           typesPlayed = new List <EAttackType>();
            BaseCard      playCard;
            SlayerRecruit playTarget;

            do
            {
                GameMessage("Please choose a card to play...");
                playCard = GetDragonPlayCard();

                if (playCard == null)
                {
                    GameMessage("Ok, your turn is over.");
                    break;
                }

                switch (playCard.CardAction)
                {
                case ECardAction.Attack:
                    if (typesPlayed.Contains(playCard.AttackType))
                    {
                        GameMessage("Sorry, you've already attacked with that type! Please choose again...");
                        continue;
                    }

                    typesPlayed.Add(playCard.AttackType);
                    playTarget = GetDragonAttackTarget();

                    if (playTarget == null)
                    {
                        GameMessage("Sorry, you have to choose a target for that attack! Please try again...");
                        continue;
                    }

                    if (!_dragonCanAttackAnyHero && playTarget.Type != ERecruitType.MenAtArms && Slayer.Party.Any(_ => _.Type == ERecruitType.MenAtArms))
                    {
                        GameMessage("Wait, you must first attack a Man-at-Arms target while they are up! Please try again...");
                        continue;
                    }

                    if (!_dragonCanAttackAnyHero && playTarget.Type != ERecruitType.Warrior && Slayer.Party.Any(_ => _.Type == ERecruitType.Warrior))
                    {
                        GameMessage("Wait, you must first attack a Warrior target while they are up! Please try again...");
                        continue;
                    }

                    var blockingCard = GetSlayerBlockingCard();
                    if (blockingCard == null)
                    {
                        if (!playTarget.Artifact.DamageReduced())
                        {
                            // Damage Applied!
                            Slayer.DamageParty(playCard, playTarget);
                            GameMessage("You successfully attacked the Slayer's party! Do you want to play another card?");
                        }
                        else
                        {
                            GameMessage("Sorry, the Slayer blocked your attack. Do you want to play another card?");
                        }
                    }
                    else
                    {
                        // Damage Blocked!
                        SlayerDeck.DiscardCard(blockingCard, Slayer.Hand);
                        GameMessage("Sorry, the Slayer blocked your attack. Do you want to play another card?");
                    }
                    _dragonCanAttackAnyHero = false;
                    DragonDeck.DiscardCard(playCard, Dragon.Hand);
                    break;

                case ECardAction.DiscardToDraw:
                    DragonDeck.DiscardCard(playCard, Dragon.Hand);
                    DragonDeck.DrawFromDeck(_dragonDrawsLess ? ReducedDrawNumber : NormalDrawNumber, Dragon.Hand, DiscardExtraDragon);
                    GameMessage("You have drawn more cards. Do you want to play another card?");
                    break;

                case ECardAction.AttackAnyHero:
                    DragonDeck.DiscardCard(playCard, Dragon.Hand);
                    _dragonCanAttackAnyHero = true;
                    GameMessage("You can now attack any hero! Do you want to play another card?");
                    break;

                case ECardAction.EnemyDrawsLess:
                    DragonDeck.DiscardCard(playCard, Dragon.Hand);
                    _slayerDrawsLess = true;
                    GameMessage("You have hindered the Slayer's next draw. Do you want to play another card?");
                    break;

                case ECardAction.Regenerate:
                    if (Dragon.HitPoints < DragonPlayer.MaxHealth)
                    {
                        DragonDeck.DiscardCard(playCard, Dragon.Hand);
                        Dragon.HitPoints++;
                        GameMessage("You have regenerated some health. Do you want to play another card?");
                    }
                    else
                    {
                        GameMessage("You are already at max health! Do you want to play another card?");
                    }
                    break;
                }

                if (Slayer.Party.Count == 0)
                {
                    // YOU WIN!
                    GameMessage("Well done, you have defeated the Slayer's party!");
                    GameOver(Dragon);
                }
            } while (playCard != null);
        }