private void ExecuteAttack(RBYPokemon Attacker, RBYPokemon Defender, Trainer Agressor) { if (Agressor.ISwitched) { Agressor.FinishSwitch(); return; } if (!Attacker.IsAlive) { return; } if (Attacker.Biding) { int dmg = Attacker.PokemonBide(); if (!Attacker.Biding) { if (dmg == 0) { Displayer.RelayMessage("Nothing was unleashed"); } else { Defender.TakeDamage(dmg, true); } } return; } if (Attacker.Recharging) { Displayer.Recharging(); Attacker.Recharging = false; return; } if (Attacker.IsFlinched) { Displayer.FlinchMsg(Attacker); return; } if (Attacker.IsTrapped) { return; } if (Defender.IsTrapped) { if (Defender.StillTrapped()) { Displayer.StillWrapped(); Defender.TakeDamage(1, false); } else { Displayer.WrappedUp(); } return; } if (Attacker.CurrentStatus == StatusConditionInflicted.Para) { if (FullParalyzed()) { Displayer.ParalyzedMsg(Attacker); Attacker.FinishTwoTurn(); return; } } else if (Attacker.CurrentStatus == StatusConditionInflicted.Sleep) { if (Attacker.Snoozing()) { Displayer.AsleepMsg(Attacker); } else { Displayer.WokeUpMsg(Attacker); } return; } if (Attacker.IsConfused) { if (Confused()) { int dmg = DamageCalculation(Attacker.InBattleAtk, Attacker.InBattleDef, Attacker.Level, 20, 1, 1, false); Displayer.ConfusedHitMsg(); Attacker.FinishTwoTurn(); Attacker.TakeDamage(dmg, true); return; } Displayer.OutOfConfusionMsg(); } var TheAttack = Attacker.Moveset[Agressor.IndexPicked]; if (Attacker.TwoTurnMove && TheAttack.Name == "METRONOME") { TheAttack = MoveEnyclopedia[Attacker.MetronomedMove]; } DeliverAttack(Attacker, Defender, TheAttack, TheAttack.Attack.Movetype); if (Attacker.IsAlive && Defender.IsAlive) { EndOfTurnEffects(Attacker, Defender); } }