private void DealDamageWithAttack(Attack attack) { Damage damage = attack.GetDamage(ActivePlayer, NonActivePlayer, this); damage.NormalDamage = DamageCalculator.GetDamageAfterWeaknessAndResistance(damage.NormalDamage, ActivePlayer.ActivePokemonCard, NonActivePlayer.ActivePokemonCard, attack, FindResistanceModifier()); if (DamageStoppers.Any(x => x.IsDamageIgnored(damage.NormalDamage + damage.DamageWithoutResistAndWeakness))) { GameLog.AddMessage("Damage ignored because of effect"); if (!IgnorePostAttack) { PostAttack(); } return; } var dealtDamage = NonActivePlayer.ActivePokemonCard.DealDamage(damage, this, ActivePlayer.ActivePokemonCard, !attack.IgnoreEffects); attack.OnDamageDealt(dealtDamage, ActivePlayer, this); if (!damage.IsZero()) { TriggerAbilityOfType(TriggerType.TakesDamage, NonActivePlayer.ActivePokemonCard, damage.NormalDamage + damage.DamageWithoutResistAndWeakness); TriggerAbilityOfType(TriggerType.DealsDamage, ActivePlayer.ActivePokemonCard, damage.NormalDamage + damage.DamageWithoutResistAndWeakness); } }
private void PostAttack() { if (AbilityTriggeredByDeath()) { GameLog.AddMessage(NonActivePlayer.ActivePokemonCard.Ability.Name + "triggered by dying"); NonActivePlayer.ActivePokemonCard.KnockedOutBy = ActivePlayer.ActivePokemonCard; TriggerAbilityOfType(TriggerType.KilledByAttack, NonActivePlayer.ActivePokemonCard, 0, NonActivePlayer.ActivePokemonCard); } DamageStoppers.ForEach(damageStopper => damageStopper.TurnsLeft--); DamageStoppers = DamageStoppers.Where(damageStopper => damageStopper.TurnsLeft > 0).ToList(); CheckDeadPokemon(); EndTurn(); }
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 virtual void EndTurn(GameField game) { if (TemporaryAbilities == null) { TemporaryAbilities = new List <Ability>(); } foreach (var ability in TemporaryAbilities) { ability.EndTurn(); if (ability.TurnDuration <= 0) { ability.OnDestroyed(game); } } TemporaryAbilities = TemporaryAbilities.Where(x => x.TurnDuration > 0).ToList(); foreach (var attack in Attacks) { attack.DamageModifier?.ReduceTurnCount(); if (attack.DamageModifier != null && attack.DamageModifier.TurnsLeft <= 0) { attack.DamageModifier = null; } foreach (var effect in attack.Effects.OfType <DamageEffect>()) { effect.DamageModifier?.ReduceTurnCount(); } } PlayedThisTurn = false; EvolvedThisTurn = false; if (!ParalyzedThisTurn) { IsParalyzed = false; } if (IsBurned) { DealDamage(20, game, new PokemonCard() { Type = EnergyTypes.Fire }, false); IsBurned = game.FlipCoins(1) == 0; } if (IsPoisoned) { DealDamage(DoublePoison ? 20 : 10, game, new PokemonCard() { Type = EnergyTypes.Psychic }, false); } if (IsAsleep) { IsAsleep = game.FlipCoins(1) == 0; } if (Ability != null) { Ability.UsedTimes = 0; Ability.EndTurn(); } ParalyzedThisTurn = false; AttachedTools = AttachedTools.Where(tool => !Owner.DiscardPile.Contains(tool)).ToList(); foreach (var damagestopper in DamageStoppers) { if (!damagestopper.LastsUntilDamageTaken) { damagestopper.TurnsLeft--; } } DamageStoppers = DamageStoppers.Where(x => x.TurnsLeft > 0).ToList(); }