Example #1
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]);
            }
        }
        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 #3
0
        protected override void Activate(Player owner, Player opponent, int damageTaken, GameField game)
        {
            if (game.FlipCoins(1) == 1)
            {
                return;
            }

            if (!game.CurrentTrainerCard.CanCast(game, opponent, owner) || !game.AskYesNo(opponent, "Would you like to play the card instead?"))
            {
                return;
            }

            game.PlayTrainerCard(game.CurrentTrainerCard, opponent);
        }
        public override void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinflipConditional.IsOk(game, caster))
            {
                return;
            }

            while (CanCast(game, caster, opponent))
            {
                if (!game.AskYesNo(caster, "Return a Pokémon to your hand?"))
                {
                    break;
                }

                PerformBounce(game, caster, opponent);
            }
        }
Example #5
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            var target = opponents ? opponent : caster;

            if (IsMay && !game.AskYesNo(target, $"Draw {Amount} Cards?"))
            {
                return;
            }

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

            int amount = UseLastDiscardCount ? (int)(game.LastDiscard * ModifierForLastDiscardCount) : Amount;

            target.DrawCards(amount);
        }
Example #6
0
        public virtual void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (TargetingMode == TargetingMode.OpponentActive && opponent.ActivePokemonCard.IsDead())
            {
                return;
            }

            string specificTargetName;

            switch (targetingMode)
            {
            case TargetingMode.YourActive:
                specificTargetName = caster.ActivePokemonCard.Name;
                break;

            case TargetingMode.OpponentActive:
                specificTargetName = opponent.ActivePokemonCard.Name;
                break;

            case TargetingMode.Self:
                specificTargetName = pokemonSource.Name;
                break;

            default:
                specificTargetName = "Pokémon";
                break;
            }

            if (isMay && !game.AskYesNo(caster, $"Return {specificTargetName} to it's owners hand?"))
            {
                return;
            }

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

            PerformBounce(game, caster, opponent);
        }
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (IsMay)
            {
                if (UseLastYesNoAnswer && !game.LastYesNo)
                {
                    return;
                }
                else if (!game.AskYesNo(caster, "Apply effect?"))
                {
                    return;
                }
            }

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

            var target = Targeting.AskForTargetFromTargetingMode(TargetingMode, game, caster, opponent, pokemonSource);

            target.TemporaryAbilities.Add(new PreventStatusEffects(target)
            {
                IsBuff          = true,
                PreventBurn     = true,
                PreventConfuse  = true,
                PreventParalyze = true,
                PreventPoison   = true,
                PreventSleep    = true,
                TurnDuration    = TurnDuration
            });
            target.TemporaryAbilities.Add(new EffectPreventer()
            {
                TurnDuration = TurnDuration
            });
        }
Example #8
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (Targeting.GetPossibleTargetsFromMode(TargetingMode, game, caster, opponent, pokemonSource).Count == 0)
            {
                return;
            }

            string yesNoInfo = EnergyToDiscard > 0 ? "Discard energy card?" : "Deal damage to a benched pokemon?";

            if (askYesNo && !game.AskYesNo(caster, yesNoInfo))
            {
                return;
            }

            if (energyToDiscard > 0)
            {
                var choices = pokemonSource.AttachedEnergy
                              .Where(e => EnergyType == EnergyTypes.All || EnergyType == EnergyTypes.None || e.EnergyType == EnergyType)
                              .OfType <Card>()
                              .ToList();

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

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

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

            var target = Targeting.AskForTargetFromTargetingMode(TargetingMode, game, caster, opponent, caster.ActivePokemonCard);

            if (target == null)
            {
                return;
            }

            int damage;

            if (DamageModifier != null)
            {
                damage = DamageModifier.NewDamage;
            }
            else
            {
                damage = Amount;
            }

            if (ApplyWeaknessResistance)
            {
                damage = DamageCalculator.GetDamageAfterWeaknessAndResistance(damage, pokemonSource, target, null, game.FindResistanceModifier());
            }
            else
            {
                damage = Amount;
            }

            target.DealDamage(damage, game, pokemonSource, true);
        }
Example #9
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
            });
        }
Example #10
0
        public int DealDamage(Damage damage, GameField game, PokemonCard source, bool preventable)
        {
            var totalDamage            = damage.DamageWithoutResistAndWeakness + damage.NormalDamage;
            var damageStoppersToRemove = new List <DamageStopper>();

            foreach (var damageStopper in DamageStoppers)
            {
                if (preventable && damageStopper.IsDamageIgnored(totalDamage))
                {
                    totalDamage -= damageStopper.Amount;

                    if (totalDamage <= 0)
                    {
                        game.GameLog.AddMessage(GetName() + " Takes no damage");
                        game?.SendEventToPlayers(new DamageTakenEvent()
                        {
                            Damage = 0, PokemonId = Id, DamageType = source != null ? source.Type : EnergyTypes.Colorless
                        });
                        return(0);
                    }
                    else
                    {
                        game.GameLog.AddMessage(GetName() + $" Takes {damageStopper.Amount} less damage");
                    }

                    if (damageStopper.LastsUntilDamageTaken)
                    {
                        damageStoppersToRemove.Add(damageStopper);
                    }
                }
            }

            foreach (var damagestopper in damageStoppersToRemove)
            {
                DamageStoppers.Remove(damagestopper);
            }

            if (source != null && preventable)
            {
                foreach (var ability in source.GetAllActiveAbilities(game, Owner, game.GetOpponentOf(Owner)).OfType <IDamageDealtModifier>())
                {
                    totalDamage = ability.GetModifiedDamage(totalDamage, game);
                }
            }
            if (preventable)
            {
                foreach (var ability in GetAllActiveAbilities(game, Owner, game?.Players.First(x => !x.Id.Equals(Owner.Id))).OfType <IDamageTakenModifier>())
                {
                    totalDamage = ability.GetModifiedDamage(totalDamage, source, game);
                }

                if (game != null)
                {
                    foreach (var ability in game.GetGlobalDamageTakenModifiers())
                    {
                        if (Ability == ablity)
                        {
                            //Self ability will already be triggered
                            continue;
                        }

                        totalDamage = ability.GetModifiedDamage(totalDamage, source, game);
                    }
                }
            }

            foreach (var pokemon in Owner.GetAllPokemonCards())
            {
                if (pokemon == this || !preventable)
                {
                    continue;
                }

                foreach (var ability in pokemon.GetAllActiveAbilities(game, Owner, game?.GetOpponentOf(Owner)).OfType <DamageRedirectorAbility>())
                {
                    if (totalDamage == 0)
                    {
                        continue;
                    }
                    if (ability.AskYesNo && !game.AskYesNo(Owner, $"Redirect damage to {ability.PokemonOwner.Name}"))
                    {
                        continue;
                    }

                    int damageToRedirect;

                    if (totalDamage >= ability.AmountToRedirect)
                    {
                        damageToRedirect = ability.AmountToRedirect;
                    }
                    else
                    {
                        damageToRedirect = totalDamage;
                    }

                    totalDamage -= damageToRedirect;
                    ability.PokemonOwner.DealDamage(damageToRedirect, game, ability.PokemonOwner, false);
                }
            }

            DamageCounters     += totalDamage;
            DamageTakenLastTurn = totalDamage;

            game?.SendEventToPlayers(new DamageTakenEvent()
            {
                Damage = totalDamage, PokemonId = Id, DamageType = source != null ? source.Type : EnergyTypes.Colorless
            });
            game?.GameLog.AddMessage(GetName() + $"Takes {totalDamage} damage");

            return(totalDamage);
        }
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!RequireTargetUsabled)
            {
                if (opponents && opponent.BenchedPokemon.Count == 0)
                {
                    return;
                }

                if (!opponents && caster.BenchedPokemon.Count == 0)
                {
                    return;
                }
            }

            if (OnlyOnCoinFlip && game.FlipCoins(1) == 0)
            {
                return;
            }

            if (IsChoice && !game.AskYesNo(caster, "Swap active Pokémon"))
            {
                return;
            }

            Player         selectedPlayer = opponentChooses ? opponent : caster;
            NetworkMessage message;

            if (selectedPlayer == caster)
            {
                if (opponents)
                {
                    message = new SelectFromOpponentBenchMessage(1).ToNetworkMessage(game.Id);
                    opponent.NetworkPlayer.Send(new InfoMessage("Opponent is selecting a new active pokemon for you").ToNetworkMessage(game.Id));
                }
                else
                {
                    message = new SelectFromYourBenchMessage(1).ToNetworkMessage(game.Id);
                    opponent.NetworkPlayer.Send(new InfoMessage("Opponent is selecting a new active pokemon").ToNetworkMessage(game.Id));
                }
            }
            else
            {
                if (opponents)
                {
                    message = new SelectFromYourBenchMessage(1).ToNetworkMessage(game.Id);
                    caster.NetworkPlayer.Send(new InfoMessage("Opponent is selecting a new active pokemon").ToNetworkMessage(game.Id));
                }
                else
                {
                    message = new SelectFromOpponentBenchMessage(1).ToNetworkMessage(game.Id);
                    caster.NetworkPlayer.Send(new InfoMessage("Opponent is selecting a new active pokemon for you").ToNetworkMessage(game.Id));
                }
            }

            NetworkId selectedId = selectedPlayer.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message).Cards.First();

            var targetPlayer = opponents ? opponent : caster;

            targetPlayer.ForceRetreatActivePokemon((PokemonCard)game.Cards[selectedId], game);
        }