Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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();
        }
Exemple #3
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);
        }
Exemple #4
0
        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();
        }