示例#1
0
        private void PlayCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot, long?targetCardId)
        {
            Card card = playerCard.Card;

            if (card.Types.HasFlag(GwintType.Creature))
            {
                PlayCreatureCard(playerCard, sender, opponent, slot, targetCardId);
            }
            else if (card.Types.HasFlag(GwintType.Weather))
            {
                PlayWeatherCard(playerCard, sender, opponent, slot);
            }
            else if (card.Types.HasFlag(GwintType.Spell))
            {
                PlaySpellCard(playerCard, sender, opponent, slot, targetCardId);
            }
            else if (card.Types.HasFlag(GwintType.RowModifier))
            {
                PlayRowModifierCard(playerCard, sender, opponent, slot);
            }
            else if (card.Types.HasFlag(GwintType.GlobalEffect))
            {
                PlayGlobalEffectCard(playerCard, sender, opponent);
            }
            else
            {
                throw new CommandException();
            }

            sender.HandCards.Remove(playerCard);
        }
示例#2
0
        private void ClearSlot(Player player, GwintSlot slot)
        {
            var cardSlots = player.CardSlots.Where(s => s.Slot == slot).ToList();

            foreach (var cardSlot in cardSlots)
            {
                player.CardSlots.Remove(cardSlot);
                player.GraveyardCards.Add(cardSlot.ToPlayerCard());
            }
        }
示例#3
0
        private static void ClearSlotEffect(Player player, GwintSlot slot, GwintEffect effect)
        {
            var existingWeatherCard = player.CardSlots
                                      .FirstOrDefault(s => s.Slot == slot && s.Card.Effect == effect);

            if (existingWeatherCard != null)
            {
                player.CardSlots.Remove(existingWeatherCard);
                player.GraveyardCards.Add(existingWeatherCard.ToPlayerCard());
            }
        }
示例#4
0
        private void SummonCloneCardsInSet(List <long> summonCardIds, Player sender, Player opponent, ICollection <PlayerCard> cards)
        {
            var summonHandCards = cards.Where(h => summonCardIds.Contains(h.Card.Id)).ToList();

            foreach (var summonHandCard in summonHandCards)
            {
                cards.Remove(summonHandCard);
                GwintSlot slot = GetDefaultCreatureSlot(summonHandCard.Card);
                SpawnCreature(summonHandCard, sender, opponent, slot);
            }
        }
示例#5
0
        private void PlayUnsummonDummy(Player player, PlayerCard playerCard, GwintSlot slot, long?targetCardId)
        {
            Card card = playerCard.Card;

            if (!targetCardId.HasValue)
            {
                throw new CommandException();
            }

            PlayerCardSlot cardSlot = GetUnsummonTargetSlot(player, slot, targetCardId.Value);

            player.HandCards.Add(cardSlot.ToPlayerCard());
            cardSlot.Card = card;
        }
示例#6
0
        private static PlayerCardSlot GetUnsummonTargetSlot(Player player, GwintSlot slot, long targetCardId)
        {
            switch (slot)
            {
            case GwintSlot.Melee:
            case GwintSlot.Ranged:
            case GwintSlot.Siege:
                var cardSlot = player.CardSlots.FirstOrDefault(s => s.Slot == slot && s.Card.Id == targetCardId);
                if (cardSlot == null)
                {
                    throw new CommandException();
                }
                return(cardSlot);

            default:
                throw new CommandException();
            }
        }
示例#7
0
        private void NurseCard(Player sender, Player opponent, long?targetCardId)
        {
            if (!targetCardId.HasValue)
            {
                throw new CommandException();
            }

            var nursedCard = sender.GraveyardCards.FirstOrDefault(c => c.Card.Id == targetCardId.Value && c.Card.Types.HasFlag(GwintType.Creature));

            if (nursedCard == null)
            {
                throw new CommandException();
            }

            GwintSlot slot = GetDefaultCreatureSlot(nursedCard.Card);

            // TODO: Check if nursed nurses can nurse. If they can then use a list of target card ids instead of a single targetCardId.
            PlayCreatureCard(nursedCard, sender, opponent, slot, null);
        }
示例#8
0
        private void ScorchRowCards(Player player, GwintSlot slot, int scorchThreshold)
        {
            var rowPower = player.CardSlots
                           .Where(s => s.Slot == slot)
                           .Sum(s => s.EffectivePower);

            if (rowPower >= scorchThreshold)
            {
                var scorchTargets = player.CardSlots
                                    .Where(s => s.Slot == slot && !s.Card.Types.HasFlag(GwintType.Hero))
                                    .GroupBy(s => s.EffectivePower)
                                    .OrderByDescending(g => g.Key)
                                    .FirstOrDefault();
                if (scorchTargets != null)
                {
                    foreach (var scorchTarget in scorchTargets)
                    {
                        player.CardSlots.Remove(scorchTarget);
                        player.GraveyardCards.Add(scorchTarget.ToPlayerCard());
                    }
                }
            }
        }
示例#9
0
        private bool ValidateSlot(PlayerCard playerCard, GwintSlot slot)
        {
            Card card  = playerCard.Card;
            var  types = card.Types;

            if (types.HasFlag(GwintType.GlobalEffect))
            {
                return(true);
            }

            switch (slot)
            {
            case GwintSlot.None:
                return(false);

            case GwintSlot.Melee:
                return(types.HasFlag(GwintType.Creature | GwintType.Melee) || types.HasFlag(GwintType.Spell));

            case GwintSlot.Ranged:
                return(types.HasFlag(GwintType.Creature | GwintType.Ranged) || types.HasFlag(GwintType.Spell));

            case GwintSlot.Siege:
                return(types.HasFlag(GwintType.Creature | GwintType.Siege) || types.HasFlag(GwintType.Spell));

            case GwintSlot.MeleeModifier:
            case GwintSlot.RangedModifier:
            case GwintSlot.SiegeModifier:
                return(types.HasFlag(GwintType.RowModifier));

            case GwintSlot.Weather:
                return(types.HasFlag(GwintType.Weather));

            default:
                throw new CommandException();
            }
        }
示例#10
0
 private bool ValidateRowModifierCard(Card card, GwintSlot slot)
 {
     return(card.Types.HasFlag(GwintType.Melee) && slot == GwintSlot.MeleeModifier ||
            card.Types.HasFlag(GwintType.Ranged) && slot == GwintSlot.RangedModifier ||
            card.Types.HasFlag(GwintType.Siege) && slot == GwintSlot.SiegeModifier);
 }
示例#11
0
        private void PlayRowModifierCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot)
        {
            Card card = playerCard.Card;

            switch (card.Effect)
            {
            case GwintEffect.Horn:
                if (!ValidateRowModifierCard(card, slot))
                {
                    throw new CommandException();
                }

                ClearSlotEffect(sender, slot, card.Effect);
                var rowModifierSlot = new PlayerCardSlot
                {
                    Card = card,
                    Slot = slot
                };
                sender.CardSlots.Add(rowModifierSlot);
                break;

            default:
                throw new CommandException();
            }
        }
示例#12
0
        private void PlaySpellCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot, long?targetCardId)
        {
            Card card = playerCard.Card;

            switch (card.Effect)
            {
            case GwintEffect.UnsummonDummy:
                PlayUnsummonDummy(sender, playerCard, slot, targetCardId);
                break;

            default:
                throw new CommandException();
            }
        }
示例#13
0
        private void PlayWeatherCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot)
        {
            Card card = playerCard.Card;

            if (slot != GwintSlot.Weather)
            {
                throw new CommandException();
            }
            if (card.Effect.HasFlag(GwintEffect.ClearSky))
            {
                ClearSlot(sender, GwintSlot.Weather);
                ClearSlot(opponent, GwintSlot.Weather);
                sender.GraveyardCards.Add(playerCard);
            }
            else
            {
                SpawnWeatherCard(playerCard, sender, opponent);
            }
        }
示例#14
0
        private void SpawnCreature(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot)
        {
            Card card = playerCard.Card;

            Player creaturePlayer = card.Types.HasFlag(GwintType.Spy) ? opponent : sender;

            switch (slot)
            {
            case GwintSlot.Melee:
            case GwintSlot.Ranged:
            case GwintSlot.Siege:
                var playerCardSlot = new PlayerCardSlot
                {
                    Card = card,
                    Slot = slot
                };
                creaturePlayer.CardSlots.Add(playerCardSlot);
                break;

            default:
                throw new CommandException();
            }
        }
示例#15
0
        private void PlayCreatureCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot, long?targetCardId)
        {
            Card card = playerCard.Card;

            SpawnCreature(playerCard, sender, opponent, slot);

            switch (card.Effect)
            {
            case GwintEffect.MeleeScorch:
                ScorchRowCards(opponent, GwintSlot.Melee, Constants.ScorchThresholdMelee);
                break;

            case GwintEffect.SiegScorch:
                ScorchRowCards(opponent, GwintSlot.Siege, Constants.ScorchThresholdSiege);
                break;

            case GwintEffect.Nurse:
                NurseCard(sender, opponent, targetCardId);
                break;

            case GwintEffect.Draw2:
                DrawCards(sender, 2);
                break;

            case GwintEffect.SummonClones:
                SummonCardClones(playerCard, sender, opponent);
                break;
            }
        }