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