Пример #1
0
        public double GenericAttackMoveExecutor(Types moveType, Pokemon attacker, Pokemon defender, Player attackerName, Player defenderName, double moveDamage, bool isCritHit)
        {
            double damage = moveDamage;

            if (this.Category.Equals("Physical"))
            {
                damage *= attacker.AttackDamage( ) / defender.DefenseDamage( );
            }
            else
            {
                damage *= attacker.SpAttackDamage( ) / defender.SpDefenseDamage( );
            }

            damage *= (0.4 * attacker.Level + 2);
            damage /= 50;
            damage += 2;
            damage *= (randomAccuracy.Next(16) + 85.0) / 100.0;
            // ((((0.4 * Level + 2) * Power * A / D) / 50 ) + 2 ) * modifier
            // modifier = targets * weather * badge * critical * random ( 85-100) * stab * type * burn
            double effectiveness = this.Effectiveness(defender.Type, defender.DualType, true);

            if (moveType.StabEffect(attacker.Type))
            {
                damage *= 1.5;
            }
            else if (moveType.StabEffect(attacker.DualType))
            {
                damage *= 1.5;
            }

            damage *= effectiveness;

            if (damage > 0)
            {
                if (isCritHit)
                {
                    WriteLine($"Critical Hit!!");
                    damage *= 2;
                }

                defender.Health -= damage;
                if (defender.Health < 0)
                {
                    damage         += defender.Health;
                    defender.Health = 0;
                }
                DisplayHealth(attacker, defender, attackerName, defenderName, damage);
            }
            return(damage);
        }