コード例 #1
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);

            if (target.Hp > onlyIfLessThanThisHp)
            {
                return;
            }

            var ability = new AttackStoppingAbility()
            {
                TurnDuration       = Duration,
                IsBuff             = true,
                OnlyStopThisAttack = OnlyThisAttack
            };

            if (OnlyStopAttacksOnSelf)
            {
                ability.OnlyOnCard = pokemonSource.Id;
            }

            target.TemporaryAbilities.Add(ability);
        }
コード例 #2
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinFlipConditional.IsOk(game, caster))
            {
                return;
            }

            if (opponent.BenchedPokemon.Count <= AmountOfTargets)
            {
                foreach (var pokemon in opponent.BenchedPokemon.ValidPokemonCards)
                {
                    pokemon.DealDamage(Damage, game, pokemonSource, true);
                }

                return;
            }

            var message  = new SelectFromOpponentBenchMessage(AmountOfTargets).ToNetworkMessage(game.Id);
            var response = caster.NetworkPlayer.SendAndWaitForResponse <CardListMessage>(message);

            foreach (var pokemon in response.Cards.Select(id => game.Cards[id]).OfType <PokemonCard>())
            {
                pokemon.DealDamage(Damage, game, pokemonSource, true);
            }
        }
コード例 #3
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinFlipConditional.IsOk(game, caster))
            {
                return;
            }

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

            if (target == null)
            {
                return;
            }

            var filter = new EvolvesFromPokemonFilter()
            {
                Name = target.Name
            };

            var response = DeckSearchUtil.SearchDeck(game, caster, new List <IDeckFilter> {
                filter
            }, 1);

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

            game.EvolvePokemon(target, (PokemonCard)response[0], true);
            caster.Deck.Cards = new Stack <Card>(caster.Deck.Cards.Except(response).ToList());
            caster.Deck.Shuffle();
        }
コード例 #4
0
        public void IsOk_No_Flip()
        {
            var condition = new CoinFlipConditional()
            {
                FlipCoin = false
            };

            Assert.True(condition.IsOk(new GameField(), new Player()));
        }
コード例 #5
0
        public void IsOk_Heads_Flip()
        {
            var condition = new CoinFlipConditional()
            {
                FlipCoin = true
            };

            Assert.True(condition.IsOk(new GameField().WithFlips(CoinFlipper.HEADS), new Player()));
        }
コード例 #6
0
        public void IsOk_Tails_Flip()
        {
            var condition = new CoinFlipConditional()
            {
                FlipCoin = true
            };

            Assert.False(condition.IsOk(new GameField().WithFlips(CoinFlipper.TAILS), new Player()));
        }
コード例 #7
0
        public override Damage GetDamage(Player owner, Player opponent, GameField game)
        {
            if (!CoinFlipConditional.IsOk(game, owner))
            {
                return(0);
            }

            var extraDamage = (owner.ActivePokemonCard.DamageCounters / 10) * extraPerDamageCounter;

            return(Damage + extraDamage);
        }
コード例 #8
0
        public void IsOk_Flip_2_2_Heads_1_Required()
        {
            var condition = new CoinFlipConditional()
            {
                FlipCoin           = true,
                CoinsToFlip        = 2,
                SuccessessForBonus = 2
            };

            Assert.True(condition.IsOk(new GameField().WithFlips(CoinFlipper.HEADS, CoinFlipper.HEADS), new Player()));
        }
コード例 #9
0
        public void IsOk_Flip_2_Check_2_Tails_1_Heads()
        {
            var condition = new CoinFlipConditional()
            {
                FlipCoin           = true,
                CoinsToFlip        = 2,
                CheckTails         = true,
                SuccessessForBonus = 2
            };

            Assert.False(condition.IsOk(new GameField().WithFlips(CoinFlipper.HEADS, CoinFlipper.TAILS), new Player()));
        }
コード例 #10
0
        public void IsOk_Last_Flip_Heads()
        {
            var condition = new CoinFlipConditional()
            {
                FlipCoin    = true,
                UseLastCoin = true
            };

            Assert.True(condition.IsOk(new GameField()
            {
                LastCoinFlipResult = CoinFlipper.HEADS, LastCoinFlipHeadCount = 1
            }, new Player()));
        }
コード例 #11
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinFlipConditional.IsOk(game, caster))
            {
                return;
            }

            game.TemporaryPassiveAbilities.Add(new StopTrainerCastsAbility(caster.ActivePokemonCard)
            {
                LimitedByTime = true,
                TurnsLeft     = 2,
                IsBuff        = true
            });
        }
コード例 #12
0
        public void IsOk_Last_Flip_Tails_Check_Tails()
        {
            var condition = new CoinFlipConditional()
            {
                FlipCoin    = true,
                UseLastCoin = true,
                CheckTails  = true
            };

            Assert.True(condition.IsOk(new GameField()
            {
                LastCoinFlipResult = CoinFlipper.TAILS, LastCoinFlipHeadCount = 0
            }, new Player()));
        }
コード例 #13
0
        public void IsOk_Double_Tails_First_Second_Check_Last()
        {
            var game = new GameField().WithFlips(CoinFlipper.TAILS, CoinFlipper.TAILS);

            var conditional = new CoinFlipConditional
            {
                FlipCoin           = true,
                CoinsToFlip        = 2,
                SuccessessForBonus = 2,
                CheckTails         = true
            };

            Assert.True(conditional.IsOk(game, null));

            var secondCondition = new CoinFlipConditional
            {
                UseLastCoin = true
            };

            Assert.True(secondCondition.IsOk(game, null));
        }
コード例 #14
0
        public override void ProcessEffects(GameField game, Player owner, Player opponent)
        {
            if (!CoinFlipConditional.IsOk(game, owner))
            {
                return;
            }

            var source = game?.ActivePlayer.ActivePokemonCard;

            owner.ActivePokemonCard.DealDamage(SelfDamage, game, source, false);
            foreach (var pokemon in opponent.BenchedPokemon.ValidPokemonCards)
            {
                pokemon.DealDamage(EnemyBenchDamage, game, source, true);
            }
            foreach (var pokemon in owner.BenchedPokemon.ValidPokemonCards)
            {
                pokemon.DealDamage(TeamBenchDamage, game, source, true);
            }

            base.ProcessEffects(game, owner, opponent);
        }
コード例 #15
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinFlipConditional.IsOk(game, caster))
            {
                return;
            }

            var filter = new ExactCardFilter()
            {
                Name = CardName, Invert = Inverted
            };

            foreach (var card in DeckSearchUtil.SearchDeck(game, caster, new List <IDeckFilter> {
                filter
            }, 1))
            {
                card.RevealToAll();
                caster.DrawCardsFromDeck(new List <NetworkId> {
                    card.Id
                });
            }
        }
コード例 #16
0
        public void IsOk_Empty()
        {
            var condition = new CoinFlipConditional();

            Assert.True(condition.IsOk(new GameField(), new Player()));
        }
コード例 #17
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinFlipConditional.IsOk(game, caster))
            {
                return;
            }

            var topCard = opponent.Deck.Cards.Pop();

            caster.RevealCard(topCard);

            if (OnlyDiscardType == CardType.Any)
            {
                opponent.DiscardPile.Add(topCard);
                opponent.TriggerDiscardEvent(new List <Card> {
                    topCard
                });
            }
            else if (OnlyDiscardType == CardType.Pokemon && topCard is PokemonCard)
            {
                opponent.DiscardPile.Add(topCard);
                opponent.TriggerDiscardEvent(new List <Card> {
                    topCard
                });
            }
            else if (OnlyDiscardType == CardType.Trainer && topCard is TrainerCard)
            {
                opponent.DiscardPile.Add(topCard);
                opponent.TriggerDiscardEvent(new List <Card> {
                    topCard
                });
            }
            else if (OnlyDiscardType == CardType.Energy && topCard is EnergyCard)
            {
                opponent.DiscardPile.Add(topCard);
                opponent.TriggerDiscardEvent(new List <Card> {
                    topCard
                });
            }
            else if (OnlyDiscardType == CardType.BasicEnergy && topCard is EnergyCard && ((EnergyCard)topCard).IsBasic)
            {
                opponent.DiscardPile.Add(topCard);
                opponent.TriggerDiscardEvent(new List <Card> {
                    topCard
                });
            }
            else if (OnlyDiscardType == CardType.BasicPokemon && topCard is PokemonCard && ((PokemonCard)topCard).Stage == 0)
            {
                opponent.DiscardPile.Add(topCard);
                opponent.TriggerDiscardEvent(new List <Card> {
                    topCard
                });
            }
            else if (DrawsIfWrong)
            {
                opponent.Deck.Cards.Push(topCard);
                opponent.DrawCards(1);
            }
            else
            {
                opponent.Deck.Cards.Push(topCard);
            }
        }
コード例 #18
0
        public void Process(GameField game, Player caster, Player opponent, PokemonCard pokemonSource)
        {
            if (!CoinFlipConditional.IsOk(game, caster))
            {
                return;
            }

            var filter = CardUtil.GetCardFilters(CardType, EnergyType).ToList();
            int amount = useLastDiscardCount ? game.LastDiscard : Amount;

            foreach (var card in DeckSearchUtil.SearchDeck(game, caster, filter, amount))
            {
                if (revealCard)
                {
                    card.RevealToAll();
                }

                switch (result)
                {
                case SearchDeckResult.PutInHand:
                    caster.DrawCardsFromDeck(new List <Card> {
                        card
                    });
                    break;

                case SearchDeckResult.PutInDiscard:
                {
                    caster.Deck.Cards.Except(new[] { card });
                    caster.DiscardPile.Add(card);
                    caster.TriggerDiscardEvent(new List <Card>()
                        {
                            card
                        });
                }
                break;

                case SearchDeckResult.PutOnBench:
                {
                    caster.Deck.Cards.Except(new[] { card });
                    int benchIndex = caster.BenchedPokemon.GetNextFreeIndex();
                    caster.BenchedPokemon.Add((PokemonCard)card);
                    game.SendEventToPlayers(new PokemonAddedToBenchEvent()
                        {
                            Player  = caster.Id,
                            Pokemon = (PokemonCard)card,
                            Index   = benchIndex
                        });
                }
                break;

                case SearchDeckResult.AttachToTarget:
                {
                    caster.Deck.Cards.Except(new[] { card });
                    var target = Targeting.AskForTargetFromTargetingMode(TargetingMode, game, caster, opponent, pokemonSource);
                    target.AttachEnergy((EnergyCard)card, game);
                }
                break;

                default:
                    break;
                }
            }

            caster.Deck.Shuffle();
        }