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; } }
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); } }
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); }
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 }); }
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); }
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 }); }
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); }