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