public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            var target = TargetsOpponent ? opponent : caster;

            var cards = new List <Card>();

            for (int i = 0; i < Amount; i++)
            {
                if (target.Deck.Cards.Count > 0)
                {
                    cards.Add(target.Deck.Cards.Pop());
                }
            }

            if (cards.Count == 0)
            {
                return;
            }

            var message  = new PickFromListMessage(cards, 1).ToNetworkMessage(game.Id);
            var response = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message);

            foreach (var id in response.Cards)
            {
                var card = cards.First(x => x.Id.Equals(id));
                target.Deck.Cards.Push(card);
            }
        }
Example #2
0
        protected override void Activate(Player owner, Player opponent, int damageTaken, GameField game)
        {
            var availablePokemons = new List <PokemonCard>(owner.BenchedPokemon.ValidPokemonCards);

            availablePokemons.Add(owner.ActivePokemonCard);

            var sourcePokemons = availablePokemons.Where(x => x.DamageCounters > 0).OfType <Card>().ToList();

            var pickFirstMessage = new PickFromListMessage(sourcePokemons, 1).ToNetworkMessage(owner.Id);
            var selectedSource   = (PokemonCard)game.Cards[owner.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(pickFirstMessage).Cards.First()];

            var availableTargets = availablePokemons.Where(x => (x.Hp - x.DamageCounters) > Amount).OfType <Card>().ToList();

            availableTargets.Remove(selectedSource);

            PokemonCard target;

            if (availableTargets.Count == 1)
            {
                target = (PokemonCard)availableTargets.First();
            }
            else
            {
                var pickTargetMessage = new PickFromListMessage(availableTargets, 1).ToNetworkMessage(owner.Id);
                target = (PokemonCard)game.Cards[owner.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(pickTargetMessage).Cards.First()];
            }


            selectedSource.Heal(Amount, game);
            target.DealDamage(Amount, game, PokemonOwner, false);
        }
Example #3
0
        protected override void Activate(Player owner, Player opponent, int damageTaken, GameField game)
        {
            if (game.AskYesNo(owner, "Look at the top card of opponents deck?"))
            {
                owner.RevealCard(opponent.Deck.Cards.Peek());
            }
            else if (game.AskYesNo(owner, "Look at the top card of your deck?"))
            {
                owner.RevealCard(owner.Deck.Cards.Peek());
            }
            else if (game.AskYesNo(owner, "Look at a random card from opponents hand?"))
            {
                owner.RevealCard(opponent.Hand[new Random().Next(0, opponent.Hand.Count)]);
            }
            else if (game.AskYesNo(owner, "Look at a prize card from opponent?"))
            {
                var message  = new PickFromListMessage(opponent.PrizeCards, 1).ToNetworkMessage(game.Id);
                var response = opponent.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message).Cards.FirstOrDefault();

                owner.RevealCard(game.Cards[response]);
            }
            else if (game.AskYesNo(owner, "Look at one of your prize cards?"))
            {
                var message  = new PickFromListMessage(owner.PrizeCards, 1).ToNetworkMessage(game.Id);
                var response = opponent.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message).Cards.FirstOrDefault();

                owner.RevealCard(game.Cards[response]);
            }
        }
        protected override void Activate(Player owner, Player opponent, int damageTaken, GameField game)
        {
            IEnumerable <Card> energyCards;
            Player             activator = GetActivator(game.ActivePlayer);

            if (energyType != EnergyTypes.All)
            {
                energyCards = activator.Hand.OfType <EnergyCard>().Where(card => energyType == card.EnergyType);
            }
            else
            {
                energyCards = activator.Hand.OfType <EnergyCard>();
            }

            var message  = new PickFromListMessage(energyCards.ToList(), 1).ToNetworkMessage(owner.Id);
            var response = owner.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message);

            var energyCard = game.Cards[response.Cards.First()];

            var selectPokemonMessage = new SelectFromYourPokemonMessage(energyType).ToNetworkMessage(owner.Id);

            response = owner.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(selectPokemonMessage);
            var selectedId = response.Cards.First();

            var pokemon = owner.ActivePokemonCard.Id.Equals(selectedId) ? owner.ActivePokemonCard : owner.BenchedPokemon.ValidPokemonCards.First(x => x.Id.Equals(selectedId));

            pokemon.AttachEnergy((EnergyCard)energyCard, game);
        }
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (MayAbility && !game.AskYesNo(caster, "Discard attached energy?"))
            {
                return;
            }

            if (!CoinflipConditional.IsOk(game, caster))
            {
                return;
            }

            if (Targeting.GetPossibleTargetsFromMode(TargetingMode, game, caster, opponent, caster.ActivePokemonCard, OnlyWithNameLike).All(x => x.AttachedEnergy.Count == 0))
            {
                return;
            }

            int cardsDiscarded = 0;

            while (true)
            {
                PokemonCard target = Targeting.AskForTargetFromTargetingMode(TargetingMode, game, caster, opponent, caster.ActivePokemonCard, string.Empty, OnlyWithNameLike);

                if (target.AttachedEnergy.Count == 0)
                {
                    continue;
                }

                if (Amount == -1 || target.AttachedEnergy.Count <= Amount)
                {
                    while (target.AttachedEnergy.Count > 0)
                    {
                        target.DiscardEnergyCard(target.AttachedEnergy[0], game);
                        cardsDiscarded++;
                    }

                    target.AttachedEnergy.Clear();
                }
                else
                {
                    var message = new PickFromListMessage(target.AttachedEnergy.OfType <Card>().ToList(), Amount);
                    var ids     = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message.ToNetworkMessage(game.Id)).Cards;

                    var cards = target.AttachedEnergy.Where(x => ids.Contains(x.Id)).ToList();

                    foreach (var card in cards)
                    {
                        target.DiscardEnergyCard(card, game);
                        cardsDiscarded++;
                    }
                }

                break;
            }

            if (targetingMode == TargetingMode.Self || targetingMode == TargetingMode.YourActive || targetingMode == TargetingMode.YourBench || targetingMode == TargetingMode.YourPokemon)
            {
                game.LastDiscard = cardsDiscarded;
            }
        }
Example #6
0
        public void PickFromListMessage()
        {
            var message = new PickFromListMessage(new List <Card> {
                new EnergyCard()
                {
                    EnergyType = EnergyTypes.Water, Amount = 1
                }
            }, 1);

            Assert.NotNull(SerializeAndBack(message));
        }
Example #7
0
        public static void DiscardAttachedEnergy(PokemonCard pokemon, int amount, GameField game)
        {
            var message  = new PickFromListMessage(pokemon.AttachedEnergy.OfType <Card>().ToList(), amount);
            var response = pokemon.Owner.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message.ToNetworkMessage(pokemon.Owner.Id));

            foreach (var id in response.Cards)
            {
                var energyCard = pokemon.AttachedEnergy.First(x => x.Id.Equals(id));
                pokemon.DiscardEnergyCard(energyCard, game);
            }
        }
Example #8
0
        public override Damage GetDamage(Player owner, Player opponent, GameField game)
        {
            var heads = game.FlipCoins(owner.ActivePokemonCard.AttachedEnergy.Count(e => OnlyThisType == EnergyTypes.All || e.EnergyType == OnlyThisType));

            if (DiscardForeachHead && heads > 0)
            {
                var message  = new PickFromListMessage(owner.ActivePokemonCard.AttachedEnergy.OfType <Card>().ToList(), heads).ToNetworkMessage(owner.Id);
                var response = owner.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message);
                opponent.ActivePokemonCard.DiscardEnergyCard((EnergyCard)game.Cards[response.Cards.First()], game);
            }

            return(Damage + (heads * ExtraBaseDamage));
        }
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            var choices   = caster.ActivePokemonCard.AttachedEnergy.Where(x => x.EnergyType == EnergyType).OfType <Card>().ToList();
            var message   = new PickFromListMessage(choices, 0, choices.Count).ToNetworkMessage(game.Id);
            var resoponse = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message);

            foreach (var card in resoponse.Cards.Select(id => game.Cards[id]))
            {
                caster.ActivePokemonCard.DiscardEnergyCard((EnergyCard)card, game);
            }

            for (int i = 0; i < resoponse.Cards.Count; i++)
            {
                var card = opponent.Deck.Cards.Pop();
                opponent.DiscardPile.Add(card);
            }
        }
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            int amount = FlipCoinsForAmount != -1 ? game.FlipCoins(FlipCoinsForAmount) : Amount;

            if (amount == 0)
            {
                return;
            }

            List <Card> choices = CardUtil.GetCardsOfType(caster.DiscardPile, CardType, EnergyType);

            var message  = new PickFromListMessage(choices, 0, amount).ToNetworkMessage(game.Id);
            var response = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message).Cards;
            var cards    = new List <Card>();

            foreach (var id in response)
            {
                var card = game.Cards[id];
                caster.DiscardPile.Remove(card);

                if (shuffleIntoDeck)
                {
                    cards.Add(card);
                    caster.Deck.Cards.Push(card);
                }
                else
                {
                    caster.Hand.Add(card);
                    game.SendEventToPlayers(new DrawCardsEvent()
                    {
                        Player = caster.Id, Cards = new List <Card>()
                        {
                            card
                        }
                    });
                }
            }

            if (shuffleIntoDeck)
            {
                opponent.RevealCards(cards);
                caster.Deck.Shuffle();
            }
        }
 public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
 {
     foreach (var pokemon in opponent.GetAllPokemonCards())
     {
         if (pokemon.AttachedEnergy.Count == 1)
         {
             pokemon.DiscardEnergyCard(pokemon.AttachedEnergy[0], game);
         }
         else
         {
             var message = new PickFromListMessage(pokemon.AttachedEnergy.OfType <Card>().ToList(), 1)
             {
                 Info = "Pick 1 Energy to discard from " + pokemon.Name
             };
             var response = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message.ToNetworkMessage(game.Id));
             pokemon.DiscardEnergyCard((EnergyCard)game.Cards[response.Cards[0]], game);
         }
     }
 }
Example #12
0
        public void PickFromListMessageDeserialize()
        {
            var player  = new Player();
            var message = new PickFromListMessage(new List <Card> {
                new EnergyCard()
                {
                    EnergyType = EnergyTypes.Water, Amount = 1
                }, new EnergyCard()
                {
                    EnergyType = EnergyTypes.Water, Amount = 1
                }
            }, 1, 1);

            var result = SerializeAndBack(message);

            Assert.Equal(1, result.MinCount);
            Assert.Equal(1, result.MaxCount);
            Assert.Equal(2, result.PossibleChoices.Count);
        }
Example #13
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            while (true)
            {
                PokemonCard target = Targeting.AskForTargetFromTargetingMode(TargetingMode, game, caster, opponent, caster.ActivePokemonCard);

                if (target == null)
                {
                    return;
                }

                if (target.AttachedEnergy.Count < amountToDiscard)
                {
                    continue;
                }

                if (target.AttachedEnergy.Count == AmountToDiscard)
                {
                    for (int i = 0; i < AmountToDiscard; i++)
                    {
                        target.DiscardEnergyCard(target.AttachedEnergy[0], game);
                    }
                    target.AttachedEnergy.Clear();
                }
                else
                {
                    var message  = new PickFromListMessage(target.AttachedEnergy.OfType <Card>().ToList(), AmountToDiscard).ToNetworkMessage(game.Id);
                    var response = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message);

                    foreach (var id in response.Cards)
                    {
                        var card = (EnergyCard)game.Cards[id];

                        target.DiscardEnergyCard(card, game);
                    }
                }

                target.Heal(AmountToHeal, game);

                break;
            }
        }
        public override void ProcessEffects(GameField game, Player owner, Player opponent)
        {
            if (!opponent.ActivePokemonCard.AttachedEnergy.Any())
            {
                return;
            }
            else if (opponent.ActivePokemonCard.AttachedEnergy.Count == 1)
            {
                var energyCard = opponent.ActivePokemonCard.AttachedEnergy[0];
                opponent.ActivePokemonCard.DiscardEnergyCard(energyCard, game);
                return;
            }

            var message  = new PickFromListMessage(opponent.ActivePokemonCard.AttachedEnergy.OfType <Card>().ToList(), 1).ToNetworkMessage(owner.Id);
            var response = owner.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message);

            opponent.ActivePokemonCard.DiscardEnergyCard((EnergyCard)game.Cards[response.Cards.First()], game);

            base.ProcessEffects(game, owner, opponent);
        }
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (CoinFlip && game.FlipCoins(1) == 0)
            {
                return;
            }

            var target = TargetsOpponent ? opponent : caster;

            List <Card> choices = CardUtil.GetCardsOfType(target.DiscardPile, CardType);

            var message  = new PickFromListMessage(choices, Amount).ToNetworkMessage(game.Id);
            var response = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message).Cards;

            foreach (var id in response)
            {
                var card = game.Cards[id];
                target.Deck.Cards.Push(card);
                target.DiscardPile.Remove(card);
            }
        }
Example #16
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            var source = Targeting.AskForTargetFromTargetingMode(SourceTargetingMode, game, caster, opponent, pokemonSource, "Select Pokémon to Move energy from");

            var availableEnergy = source.AttachedEnergy.Where(e => EnergyType == EnergyTypes.All || e.EnergyType == EnergyType).ToList();

            if (availableEnergy.Count > AmountToMove)
            {
                var pickEnergyMessage = new PickFromListMessage(availableEnergy.OfType <Card>().ToList(), AmountToMove).ToNetworkMessage(game.Id);
                var response          = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(pickEnergyMessage);

                availableEnergy.Clear();
                foreach (var id in response.Cards)
                {
                    availableEnergy.Add((EnergyCard)game.Cards[id]);
                }
            }

            var newTarget = Targeting.AskForTargetFromTargetingMode(NewTargetingMode, game, caster, opponent, pokemonSource, "Select Pokémon to Move energy from");

            if (newTarget == null)
            {
                foreach (var energy in availableEnergy)
                {
                    source.DiscardEnergyCard(energy, game);
                }
            }
            else
            {
                foreach (var energy in availableEnergy)
                {
                    source.AttachedEnergy.Remove(energy);
                    game.SendEventToPlayers(new AttachedEnergyDiscardedEvent()
                    {
                        DiscardedCard = energy, FromPokemonId = source.Id
                    });
                    newTarget.AttachEnergy(energy, game);
                }
            }
        }
Example #17
0
 public void Init(PickFromListMessage pickFromListMessage)
 {
     InitForCards(pickFromListMessage.PossibleChoices, pickFromListMessage.MinCount, pickFromListMessage.MaxCount);
 }
Example #18
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            PokemonCard source;

            while (true)
            {
                source = Targeting.AskForTargetFromTargetingMode(Source, game, caster, opponent, pokemonSource, "Select a pokemon to move energy from");

                if (FromAnother && source == pokemonSource)
                {
                    continue;
                }

                break;
            }

            if (source == null)
            {
                return;
            }

            var availableEnergyCards = source.AttachedEnergy
                                       .Where(energy => !OnlyBasic || (OnlyBasic && energy.IsBasic))
                                       .Where(energy => EnergyType == EnergyTypes.All || EnergyType == EnergyTypes.None || energy.EnergyType == EnergyType)
                                       .ToList();

            PokemonCard target;
            bool        first = true;

            if (availableEnergyCards.Count <= Amount)
            {
                target = Targeting.AskForTargetFromTargetingMode(Target, game, caster, opponent, pokemonSource, "Select a pokemon to move energy to");
                while (source.AttachedEnergy.Count > 0)
                {
                    var energyCard = source.AttachedEnergy[0];

                    source.AttachedEnergy.RemoveAt(0);

                    game.SendEventToPlayers(new AttachedEnergyDiscardedEvent {
                        DiscardedCard = energyCard, FromPokemonId = source.Id
                    });

                    if (DifferentTargetForEachCard && !first)
                    {
                        target = Targeting.AskForTargetFromTargetingMode(Target, game, caster, opponent, pokemonSource, "Select a pokemon to move energy to");
                    }

                    target.AttachedEnergy.Add(energyCard);

                    game.SendEventToPlayers(new EnergyCardsAttachedEvent {
                        EnergyCard = energyCard, AttachedTo = target
                    });
                    first = false;
                }

                return;
            }

            var message = new PickFromListMessage(availableEnergyCards.OfType <Card>().ToList(), 1, Amount);
            var ids     = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message.ToNetworkMessage(game.Id)).Cards;

            var cards = source.AttachedEnergy.Where(x => ids.Contains(x.Id)).ToList();

            target = Targeting.AskForTargetFromTargetingMode(Target, game, caster, opponent, pokemonSource, "Select a pokemon to move energy to");

            foreach (var card in cards)
            {
                if (DifferentTargetForEachCard && !first)
                {
                    target = Targeting.AskForTargetFromTargetingMode(Target, game, caster, opponent, pokemonSource, "Select a pokemon to move energy to");
                }

                source.AttachedEnergy.Remove(card);

                game.SendEventToPlayers(new AttachedEnergyDiscardedEvent {
                    DiscardedCard = card, FromPokemonId = source.Id
                });

                target.AttachedEnergy.Add(card);

                game.SendEventToPlayers(new EnergyCardsAttachedEvent {
                    EnergyCard = card, AttachedTo = target
                });
                first = false;
            }
        }
Example #19
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            Player target;

            if (AskYesNoToTargetOpponent && game.AskYesNo(caster, "Put Pokémon from opponents discard onto their bench?"))
            {
                target = opponent;
            }
            else
            {
                target = caster;
            }

            if (TargetsOpponent)
            {
                target = opponent;
            }

            var pokemons = target.DiscardPile.OfType <PokemonCard>().Where(pokemon => pokemon.Stage == 0).OfType <Card>().ToList();

            if (pokemons.Count == 0 || target.BenchedPokemon.Count == GameField.BenchMaxSize)
            {
                return;
            }

            var message  = new PickFromListMessage(pokemons, 1).ToNetworkMessage(game.Id);
            var response = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message).Cards.First();

            var card = game.Cards[response];

            var pokemonCard = (PokemonCard)card;

            int index = target.BenchedPokemon.GetNextFreeIndex();

            target.BenchedPokemon.Add(pokemonCard);
            target.DiscardPile.Remove(card);

            if (WithRemainingHealth > 0 && WithRemainingHealth < 1)
            {
                var health = (int)Math.Ceiling(pokemonCard.Hp * WithRemainingHealth);

                if (health.ToString().Last() == '5')
                {
                    health += 5;
                }

                pokemonCard.DamageCounters = health;
            }
            else if (WithRemainingHealth > 1)
            {
                pokemonCard.DamageCounters = pokemonCard.Hp - (int)WithRemainingHealth;
            }
            else
            {
                pokemonCard.DamageCounters = 0;
            }

            game.SendEventToPlayers(new PokemonAddedToBenchEvent()
            {
                Pokemon = pokemonCard, Player = target.Id, Index = index
            });
        }