Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinflipConditional.IsOk(game, caster))
            {
                return;
            }

            DamageStopper damageStopper;

            if (maxDamage > 0)
            {
                damageStopper = new DamageStopper((x) => x <= maxDamage)
                {
                    Amount = amount
                };
            }
            else
            {
                damageStopper = new DamageStopper((x) => true)
                {
                    Amount = amount
                };
            }

            damageStopper.LastsUntilDamageTaken = LastsUntilDamage;

            if (onlyProtectSelf)
            {
                pokemonSource.DamageStoppers.Add(damageStopper);
            }
            else
            {
                game.DamageStoppers.Add(damageStopper);
            }
        }
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (CoinflipConditional.IsOk(game, caster))
            {
                return;
            }

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

            target.TemporaryAbilities.Add(new DamageTakenModifier(target)
            {
                Modifer = 999999,
                IsBuff  = true
            });
            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
            });
        }
Ejemplo n.º 4
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            var target = TargetsOpponent ? opponent : caster;

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

            if (amount == -1)
            {
                var allCards = new List <Card>(target.Hand);

                game.LastDiscard = allCards.Count;

                if (ShuffleIntoDeck)
                {
                    target.Deck.ShuffleInCards(new List <Card>(target.Hand));
                    target.Hand.Clear();
                    target.TriggerDiscardEvent(allCards);
                }
                else
                {
                    target.DiscardCards(allCards);
                }
                return;
            }

            IDeckFilter[] filters = CardUtil.GetCardFilters(CardType).ToArray();

            int minAmount = AllowDiscardLess ? 0 : Amount;

            GameUtils.DiscardCardsFromHand(target, game, new DiscardCardSettings(minAmount, Amount, filters, ShuffleIntoDeck));
        }
Ejemplo n.º 5
0
        public void OnAttachedTo(PokemonCard attachedTo, bool fromHand, GameField game)
        {
            if (!CoinflipConditional.IsOk(game, attachedTo.Owner))
            {
                return;
            }

            attachedTo.Heal(Amount, game);
        }
Ejemplo n.º 6
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinflipConditional.IsOk(game, caster))
            {
                return;
            }

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

            ApplyEffectTo(target, StatusEffect, game);
            ApplyEffectTo(target, SecondaryEffect, game);
        }
Ejemplo n.º 7
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            var selector = OpponentPicks ? opponent : caster;
            var other    = OpponentPicks ? caster : opponent;

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

            PokemonCard target = Targeting.AskForTargetFromTargetingMode(TargetingMode, game, selector, other, selector.ActivePokemonCard);

            target?.Heal(Amount, game);
        }
Ejemplo n.º 8
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (CoinflipConditional.IsOk(game, caster))
            {
                return;
            }

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

            target?.TemporaryAbilities.Add(new RetreatStopper(target, Turns)
            {
                IsBuff = true
            });
        }
Ejemplo n.º 9
0
        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);
            }
        }
Ejemplo n.º 10
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinflipConditional.IsOk(game, caster))
            {
                return;
            }

            foreach (PokemonCard card in DeckSearchUtil.SearchDeck(game, caster, new List <IDeckFilter> {
                new PokemonWithNameOrTypeFilter(Names, EnergyType)
                {
                    OnlyBasic = addToBench, InvertName = InvertNameSearch
                }
            }, Amount))
            {
                caster.Deck.Cards = new Stack <Card>(caster.Deck.Cards.Except(new[] { card }));

                if (revealCard)
                {
                    card.RevealToAll();
                }

                if (evolveSource)
                {
                    game.EvolvePokemon(pokemonSource, card, true);
                }
                else if (addToBench)
                {
                    caster.BenchedPokemon.Add(card);
                    game.SendEventToPlayers(new PokemonAddedToBenchEvent()
                    {
                        Player = caster.Id, Pokemon = card, Index = caster.BenchedPokemon.Count - 1
                    });
                }
                else
                {
                    caster.Hand.Add(card);
                    game.SendEventToPlayers(new DrawCardsEvent()
                    {
                        Player = caster.Id, Cards = new List <Card>()
                        {
                            card
                        }
                    });
                }
            }
        }
Ejemplo n.º 11
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);
        }
Ejemplo n.º 12
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinflipConditional.IsOk(game, caster))
            {
                return;
            }

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

            var damage = heads * Amount;

            if (applyWeaknessResistance)
            {
                damage = DamageCalculator.GetDamageAfterWeaknessAndResistance(damage, pokemonSource, target, null, null);
            }

            target.DealDamage(damage, game, pokemonSource, true);
        }
Ejemplo n.º 13
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);
        }
Ejemplo n.º 14
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            var target = targetsOpponent ? opponent : caster;

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

            List <Card> cardsToDiscard;

            if (Amount == -1 || target.Hand.Count <= Amount)
            {
                cardsToDiscard = new List <Card>(target.Hand);
            }
            else
            {
                var random = new Random();
                cardsToDiscard = target.Hand.OrderBy(x => random.Next(int.MaxValue)).Take(Amount).ToList();
            }

            if (ShuffleIntoDeck)
            {
                target.Deck.ShuffleInCards(cardsToDiscard);

                foreach (var card in cardsToDiscard)
                {
                    target.Hand.Remove(card);
                }

                target.TriggerDiscardEvent(cardsToDiscard);
            }
            else
            {
                target.DiscardCards(cardsToDiscard);
            }
        }
        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
            });
        }
Ejemplo n.º 16
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);
        }