示例#1
0
文件: MapNpc.cs 项目: pzaps/Server
        public void UseMoveOnAllies(BattleSetup setup, TargetCollection targets)
        {
            //List<ICharacter> targets = MoveProcessor.GetTargetsInRange(setup.Move.RangeType, setup.Move.Range, setup.AttackerMap, this, X, Y, Direction);
            Move move = setup.SetdownMove();

            foreach (ICharacter i in targets.Friends) {
                if (i.CharacterType == Enums.CharacterType.MapNpc && ((MapNpc)i).Num <= 0) {

                } else {
                    setup.Defender = i;
                    BattleProcessor.MoveHitCharacter(setup);
                    setup.SetupMove(move);
                    if (setup.Cancel) {
                        return;
                    }
                }
            }
        }
示例#2
0
        public static void MoveAdditionalEffect(BattleSetup setup)
        {
            try {
                ExtraStatus status;
                switch (setup.Move.AdditionalEffectData1) {
                    case 1: {//burn
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);

                                }
                            }
                        }
                        break;
                    case 2: {//freeze
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Freeze, 1, setup.PacketStack);

                                }
                            }
                        }
                        break;
                    case 3: {//paralysis
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Paralyze, 1, setup.PacketStack);

                                }
                            }
                        }
                        break;
                    case 4: {//poison
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Poison, setup.Move.AdditionalEffectData3, setup.PacketStack);

                                }
                            }
                        }
                        break;
                    case 5: {//sleep
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Sleep, setup.Move.AdditionalEffectData3, setup.PacketStack);

                                }
                            }
                        }
                        break;
                    case 6: {//confuse
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    //Confuse(setup.Defender, setup.Attacker, setup.DefenderMap, Server.Math.Rand(5, 11), setup.PacketStack);
                                    AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Confusion", Server.Math.Rand(5, 11), null, "", setup.PacketStack, true);
                                }
                            }
                        }
                        break;
                    case 7: {//flinch
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    Flinch(setup.Defender, setup.Attacker, setup.DefenderMap, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 8: {//pause
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {

                                }
                            }
                        }
                        break;
                    case 14: {//atk ~ self
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeAttackBuff(setup.Attacker, setup.AttackerMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 15: {//def ~ self
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeDefenseBuff(setup.Attacker, setup.AttackerMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 16: {//spatk ~ self
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 17: {//spdef ~ self
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeSpDefBuff(setup.Attacker, setup.AttackerMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 18: {//speed ~ self
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeSpeedBuff(setup.Attacker, setup.AttackerMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 19: {//acc ~ self
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeAccuracyBuff(setup.Attacker, setup.AttackerMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 20: {//eva ~ self
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeEvasionBuff(setup.Attacker, setup.AttackerMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 21: {//atk
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 22: {//def
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 23: {//spatk
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 24: {//spdef
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 25: {//speed
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 26: {//acc
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 27: {//eva
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.AdditionalEffectData3, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 28: {//recoil
                            if (setup.Hit && !HasAbility(setup.Attacker, "Rock Head") && !HasAbility(setup.Attacker, "Magic Guard")) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " was hit with recoil!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                int newHP = setup.Defender.HP;
                                if (newHP < 0) newHP = 0;
                                int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - newHP) / (setup.Move.AdditionalEffectData2 * 2);
                                if (recoil < 0) recoil = 0;
                                if (recoil >= setup.Attacker.HP) {
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                    setup.Cancel = true;
                                } else {
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                }
                            }
                        }
                        break;
                    case 29: {//critical

                        }
                        break;
                    case 30: {//set dmg

                        }
                        break;
                    case 31: {//absorb
                            if (setup.Hit && setup.Damage > 0) {
                                //if  (!setup.KnockedOut || setup.Defender.HP > 0) {
                                int heal = setup.Move.AdditionalEffectData2;
                                //big root
                                if (setup.Attacker.HasActiveItem(194)) heal += 20;
                                //pokemon-specific item
                                if (HasActiveBagItem(setup.Attacker, 5, 0, 0)) {
                                    heal += 30;
                                }
                                if (HasAbility(setup.Defender, "Liquid Ooze")) {
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " sucked up the Liquid Ooze!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, setup.Damage * heal / 100, Enums.KillType.Other, setup.PacketStack, true);
                                } else {
                                    HealCharacter(setup.Attacker, setup.AttackerMap, setup.Damage * heal / 100, setup.PacketStack);
                                }
                                //} else {
                                //HealCharacter(setup.Attacker, setup.AttackerMap, setup.Damage / 2, setup.PacketStack);
                                //}
                            }
                        }
                        break;
                    case 35: {//Snore; flinch chance
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    Flinch(setup.Defender, setup.Attacker, setup.DefenderMap, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 37: {//breaks through ice; may cause burn
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 38: {//breaks through ice; recoil; may cause burn
                            if (setup.Hit) {
                                if (!setup.KnockedOut || setup.Defender.HP > 0) {
                                    if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                        SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);
                                    }
                                }
                                if (!HasAbility(setup.Attacker, "Rock Head") && !HasAbility(setup.Attacker, "Magic Guard")) {
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " was hit with recoil!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                    int newHP = setup.Defender.HP;
                                    if (newHP < 0) newHP = 0;
                                    int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - newHP) / (setup.Move.AdditionalEffectData3 * 2);
                                    if (recoil < 0) recoil = 0;
                                    if (recoil >= setup.Attacker.HP) {
                                        DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                        setup.Cancel = true;
                                    } else {
                                        DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                    }
                                }
                            }
                        }
                        break;
                    case 46: {//Lowers Two Stats (attacker)
                            if (setup.BattleTags.Contains("HitSomething")) {
                                switch (setup.Move.AdditionalEffectData2) {
                                    case 1: {
                                            ChangeAttackBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                    case 2: {
                                            ChangeDefenseBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                    case 3: {
                                            ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                    case 4: {
                                            ChangeSpDefBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                    case 5: {
                                            ChangeSpeedBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                }
                                switch (setup.Move.AdditionalEffectData3) {
                                    case 1: {
                                            ChangeAttackBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                    case 2: {
                                            ChangeDefenseBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                    case 3: {
                                            ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                    case 4: {
                                            ChangeSpDefBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                    case 5: {
                                            ChangeSpeedBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                        }
                                        break;
                                }
                            }

                        }
                        break;
                    case 47: {//+Atk/Def/SpAtk/SpDef/Speed
                            if (setup.Hit) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    ChangeAttackBuff(setup.Attacker, setup.AttackerMap, 1, setup.PacketStack);
                                    ChangeDefenseBuff(setup.Attacker, setup.AttackerMap, 1, setup.PacketStack);
                                    ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, 1, setup.PacketStack);
                                    ChangeSpDefBuff(setup.Attacker, setup.AttackerMap, 1, setup.PacketStack);
                                    ChangeSpeedBuff(setup.Attacker, setup.AttackerMap, 1, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 48: {//recoil; may cause paralyze
                            if (setup.Hit) {
                                if (!setup.KnockedOut || setup.Defender.HP > 0) {
                                    if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                        SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Paralyze, 1, setup.PacketStack);
                                    }
                                }
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " was hit with recoil!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                    int newHP = setup.Defender.HP;
                                    if (newHP < 0) newHP = 0;
                                    int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - newHP) / (setup.Move.AdditionalEffectData3 * 2);
                                    if (recoil < 0) recoil = 0;
                                    if (recoil >= setup.Attacker.HP) {
                                        DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                        setup.Cancel = true;
                                    } else {
                                        DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                    }
                            }
                        }
                        break;
                    case 49: {// critical + status
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, (Enums.StatusAilment)setup.Move.AdditionalEffectData3, 1, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 50: {// tri Attack
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    switch (Server.Math.Rand(0, 3)) {
                                        case 0: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);
                                            }
                                            break;
                                        case 1: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Freeze, 1, setup.PacketStack);
                                            }
                                            break;
                                        case 2: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Paralyze, 1, setup.PacketStack);
                                            }
                                            break;
                                    }
                                }
                            }
                        }
                        break;
                    case 51: {//elemental fangs; flinch + status
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, (Enums.StatusAilment)setup.Move.AdditionalEffectData3, Server.Math.Rand(3, 9), setup.PacketStack);
                                }
                            }
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    Flinch(setup.Defender, setup.Attacker, setup.DefenderMap, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 58: {//Partial trapper
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                int trapTime = 3;
                                if (setup.Attacker.HasActiveItem(45)) {//Grip Claw
                                    trapTime = 5;
                                }
                                string intensity = "";
                                if (setup.Attacker.HasActiveItem(481)) {
                                    intensity = "1";
                                }
                                switch (setup.Move.AdditionalEffectData2) {
                                    case 1: {//Bind
                                            if (setup.Attacker.VolatileStatus.GetStatus("Bind:1") == null && setup.Defender.VolatileStatus.GetStatus("Bind:0") == null && !CheckStatusProtection(setup.Defender, setup.DefenderMap, "Bind:0", true, setup.PacketStack)) {
                                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Bind:0", Server.Math.Rand(trapTime, trapTime + 1), setup.Attacker, intensity, setup.PacketStack);
                                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Bind:1", -1, setup.Defender, intensity, setup.PacketStack);
                                            }
                                        }
                                        break;
                                    case 2: {//Wrap
                                            if (setup.Attacker.VolatileStatus.GetStatus("Wrap:1") == null && setup.Defender.VolatileStatus.GetStatus("Wrap:0") == null && !CheckStatusProtection(setup.Defender, setup.DefenderMap, "Wrap:0", true, setup.PacketStack)) {
                                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Wrap:0", Server.Math.Rand(trapTime, trapTime + 1), setup.Attacker, intensity, setup.PacketStack);
                                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Wrap:1", -1, setup.Defender, intensity, setup.PacketStack);
                                            }
                                        }
                                        break;
                                    case 3: {//Clamp
                                            if (setup.Attacker.VolatileStatus.GetStatus("Clamp:1") == null && setup.Defender.VolatileStatus.GetStatus("Clamp:0") == null && !CheckStatusProtection(setup.Defender, setup.DefenderMap, "Clamp:0", true, setup.PacketStack)) {
                                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Clamp:0", Server.Math.Rand(trapTime, trapTime + 1), setup.Attacker, intensity, setup.PacketStack);
                                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Clamp:1", -1, setup.Defender, intensity, setup.PacketStack);
                                            }
                                        }
                                        break;
                                    case 4: {//Fire Spin
                                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "FireSpin", Server.Math.Rand(trapTime, trapTime + 2), null, intensity, setup.PacketStack, true);
                                        }
                                        break;
                                    case 5: {//Whirlpool
                                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Whirlpool", Server.Math.Rand(trapTime, trapTime + 2), null, intensity, setup.PacketStack, true);
                                        }
                                        break;
                                    case 6: {//Sand Tomb
                                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "SandTomb", Server.Math.Rand(trapTime, trapTime + 2), null, intensity, setup.PacketStack, true);
                                        }
                                        break;
                                    case 7: {//Magma Storm
                                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "MagmaStorm", Server.Math.Rand(trapTime, trapTime + 1), null, intensity, setup.PacketStack, true);
                                        }
                                        break;
                                    case 8: {//Infestation
                                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Infestation", Server.Math.Rand(trapTime, trapTime + 2), null, intensity, setup.PacketStack, true);
                                        }
                                        break;

                                }
                            }
                        }
                        break;
                    case 60: {//charge-up moves (extra effects here)
                            switch (setup.Move.AdditionalEffectData2) {
                                case 4: {//sky attack
                                        if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                            if (Server.Math.Rand(0, 100) <= 30) {
                                                Flinch(setup.Defender, setup.Attacker, setup.DefenderMap, setup.PacketStack);
                                            }
                                        }
                                    }
                                    break;
                                case 7: {//bounce
                                        if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                            if (Server.Math.Rand(0, 100) <= 30) {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Paralyze, 1, setup.PacketStack);
                                            }
                                        }
                                    }
                                    break;
                            }
                        }
                        break;
                    case 61: {//rampage moves (thrash, petal dance, outrage)
                            if (setup.Attacker.VolatileStatus.GetStatus("Rampage") == null) {
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Rampage", Server.Math.Rand(2, 5), null, setup.moveIndex.ToString(), setup.PacketStack);
                            }
                        }
                        break;
                    case 62: {//rolling moves (rollout, ice ball)
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (setup.Attacker.VolatileStatus.GetStatus("Rolling") == null) {
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "Rolling", 1, null, setup.moveIndex.ToString(), setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 63: {//fury cutter
                            if (setup.BattleTags.Contains("HitSomething")) {
                                if (setup.Attacker.VolatileStatus.GetStatus("FuryCutter") == null) {
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "FuryCutter", 1, null, "", setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 70: {//spit up
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Stockpile", setup.PacketStack);
                        }
                        break;
                    case 79: {//smellingsalt
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)
                                && setup.Defender.StatusAilment == (Enums.StatusAilment)setup.Move.AdditionalEffectData2
                                && setup.Move.AdditionalEffectData3 == 0) {
                                SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                            }
                        }
                        break;
                    case 85: {//rapid spin
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Wrap:0", setup.PacketStack, true);
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Bind:0", setup.PacketStack, true);
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Clamp:0", setup.PacketStack, true);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "FireSpin", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Whirlpool", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Infestation", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "SandTomb", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "MagmaStorm", setup.PacketStack);
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "LeechSeed:0", setup.PacketStack, true);
                        }
                        break;
                    case 86: {//Defog
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Reflect", setup.PacketStack);
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "LightScreen", setup.PacketStack);
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Mist", setup.PacketStack);
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Safeguard", setup.PacketStack);
                        }
                        break;
                    case 103: {//Haze effect
                            RemoveBuffs(setup.Defender);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s stat changes were removed!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                        }
                        break;
                    case 112: {//false swipe
                            setup.KnockedOut = false;
                        }
                        break;
                    case 113: {//uproar
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Sleepless", 0, null, "", setup.PacketStack);
                            }
                        }
                        break;
                    case 125: {//phazer effect
                            if (setup.Hit) {
                                BlowBack(setup.Defender, setup.DefenderMap, setup.Attacker.Direction, setup.PacketStack);
                            }
                        }
                        break;
                    case 133: {//u-turn
                            int blockX = setup.Attacker.X;
                            int blockY = setup.Attacker.Y;
                            FindNearestBlock(setup.AttackerMap, (Enums.Direction)(((int)setup.Attacker.Direction + 1) % 2 + (int)setup.Attacker.Direction / 2 * 2), ref blockX, ref blockY);

                            setup.Attacker.Y = blockY;
                            setup.Attacker.X = blockX;

                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " jumped back!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                PacketBuilder.AppendPlayerXY(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            } else if (setup.Attacker.CharacterType == Enums.CharacterType.MapNpc) {
                                PacketBuilder.AppendNpcXY(setup.AttackerMap, setup.PacketStack, ((MapNpc)setup.Attacker).MapSlot);
                            }
                        }
                        break;
                    case 136: {//brick break
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Reflect", setup.PacketStack);
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "LightScreen", setup.PacketStack);
                        }
                        break;
                    case 155: {//Reflect Type
                            if (GetBattleTagArg(setup.BattleTags, "ReflectType", 1) != null) {
                                string[] typeParams = GetBattleTagArg(setup.BattleTags, "ReflectType", 1).Split(',');

                                int type1 = typeParams[Server.Math.Rand(0, typeParams.Length / 2) * 2].ToInt();
                                int type2 = typeParams[Server.Math.Rand(0, typeParams.Length / 2) * 2 + 1].ToInt();

                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type1", type1, null, "", setup.PacketStack);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type2", type2, null, "", setup.PacketStack);

                                RemoveBattleTag(setup.BattleTags, "ReflectType");

                            } else {

                            }

                        }
                        break;
                    case 160: {//round
                        if (MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Friend) {
                                int roundSlot = -1;

                                for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                                    if (setup.Defender.Moves[i].MoveNum == 629) {
                                        roundSlot = i;
                                    }
                                }

                                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                    if (setup.BattleTags.Contains("Round:" + (int)setup.Defender.CharacterType + ":" + ((Recruit)setup.Defender).Owner.Player.CharID)) {
                                        roundSlot = -1;
                                    }
                                } else if (setup.Defender.CharacterType == Enums.CharacterType.MapNpc) {
                                    if (setup.BattleTags.Contains("Round:" + (int)setup.Defender.CharacterType + ":" + ((MapNpc)setup.Defender).MapSlot)) {
                                        roundSlot = -1;
                                    }
                                }

                                if (roundSlot > -1) {

                                    BattleSetup groupSetup = new BattleSetup();
                                    groupSetup.Attacker = setup.Defender;
                                    groupSetup.moveSlot = roundSlot;

                                    foreach (string tag in setup.BattleTags) {
                                        if (tag.StartsWith("Round")) {
                                            groupSetup.BattleTags.Add(tag);
                                        }
                                    }

                                    BattleProcessor.HandleAttack(groupSetup);

                                    BattleProcessor.FinalizeAction(groupSetup, setup.PacketStack);
                                }
                            }

                        }
                        break;
                    case 163: {//echoed voice
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                status = setup.Defender.VolatileStatus.GetStatus("EchoedVoice");
                                if (status != null) {
                                    status.Counter++;
                                } else {
                                    AddExtraStatus(setup.Defender, setup.DefenderMap, "EchoedVoice", 1, null, "", setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 165: {//flame burst
                            if (setup.Hit) {
                                if (GetBattleTagArg(setup.BattleTags, "FlameBurst", 0) == null) {
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSoundPacket("magic215.wav"), setup.Defender.X, setup.Defender.Y, 10);
                                    for (int i = setup.Defender.X - 2; i <= setup.Defender.X + 2; i++) {
                                        for (int j = setup.Defender.Y - 2; j <= setup.Defender.Y + 2; j++) {
                                            if (i < 0 || j < 0 || i > setup.DefenderMap.MaxX || j > setup.DefenderMap.MaxY
                                                || (i == setup.Defender.X && j == setup.Defender.Y)) {

                                            } else {
                                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSpellAnim(506, i, j));
                                            }
                                        }
                                    }
                                    TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 2, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, true, true, true);
                                    for (int i = 0; i < targets.Count; i++) {
                                        if (!(targets[i].X == setup.Defender.X && targets[i].Y == setup.Defender.Y)) {
                                            if (!SafeZoneCheck(setup.Attacker, setup.AttackerMap, targets[i], setup.DefenderMap)) {
                                                DamageCharacter(targets[i], setup.DefenderMap, targets[i].MaxHP / 16, Enums.KillType.Other, setup.PacketStack, true);
                                            }
                                        }
                                    }
                                    setup.BattleTags.Add("FlameBurst");
                                }
                            }
                        }
                        break;
                    case 166: {//Stat Swap
                            switch (setup.Move.AdditionalEffectData2) {
                                case 1: {//power Swap
                                        if (GetBattleTagArg(setup.BattleTags, "PowerSwap", 1) != null) {
                                            setup.Attacker.AttackBuff = GetBattleTagArg(setup.BattleTags, "PowerSwap", 2).ToInt();
                                            setup.Attacker.SpAtkBuff = GetBattleTagArg(setup.BattleTags, "PowerSwap", 3).ToInt();
                                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " received " + GetBattleTagArg(setup.BattleTags, "PowerSwap", 1) + "'s changes to Attack and Special Attack!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                            RemoveBattleTag(setup.BattleTags, "PowerSwap");

                                        } else {

                                        }
                                    }
                                    break;
                                case 2: {//guard swap
                                        if (GetBattleTagArg(setup.BattleTags, "GuardSwap", 1) != null) {
                                            setup.Attacker.DefenseBuff = GetBattleTagArg(setup.BattleTags, "GuardSwap", 2).ToInt();
                                            setup.Attacker.SpDefBuff = GetBattleTagArg(setup.BattleTags, "GuardSwap", 3).ToInt();
                                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " received " + GetBattleTagArg(setup.BattleTags, "GuardSwap", 1) + "'s changes to Defense and Special Defense!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                            RemoveBattleTag(setup.BattleTags, "GuardSwap");

                                        } else {

                                        }
                                    }
                                    break;
                                case 3: {//heart swap
                                        if (GetBattleTagArg(setup.BattleTags, "HeartSwap", 1) != null) {
                                            setup.Attacker.AttackBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 2).ToInt();
                                            setup.Attacker.SpAtkBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 3).ToInt();
                                            setup.Attacker.DefenseBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 4).ToInt();
                                            setup.Attacker.SpDefBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 5).ToInt();
                                            setup.Attacker.SpeedBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 6).ToInt();
                                            setup.Attacker.AccuracyBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 7).ToInt();
                                            setup.Attacker.EvasionBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 8).ToInt();
                                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " received " + GetBattleTagArg(setup.BattleTags, "HeartSwap", 1) + "'s stat changes!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                            RemoveBattleTag(setup.BattleTags, "HeartSwap");

                                        } else {

                                        }
                                    }
                                    break;
                            }
                        }
                        break;
                    case 171: {//Bug Bite/Pluck
                            if (setup.Hit) {
                                BattleSetup itemSetup = new BattleSetup();
                                itemSetup.Attacker = setup.Attacker;
                                //itemSetup.PacketStack = setup.PacketStack;
                                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                    Client client = ((Recruit)setup.Defender).Owner;
                                    List<int> itemsToRemove = new List<int>();
                                    for (int i = 1; i <= client.Player.MaxInv; i++) {
                                        if (CheckItemEdibility(client.Player.Inventory[i].Num) > 0) {
                                            itemsToRemove.Add(i);
                                        }
                                    }
                                    if (itemsToRemove.Count > 0) {
                                        int randomItem = itemsToRemove[Server.Math.Rand(0, itemsToRemove.Count)];
                                        if (CanUseItem(setup, client.Player.Inventory[randomItem])) {
                                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " took the " + ItemManager.Items[client.Player.Inventory[randomItem].Num].Name + "!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                            BattleProcessor.HandleItemUse(client.Player.Inventory[randomItem], -1, itemSetup);
                                            client.Player.TakeItemSlot(randomItem, 1, true);
                                        }
                                        Messenger.SendInventory(client);
                                    }
                                } else {
                                    MapNpc npc = (MapNpc)setup.Defender;
                                    if (npc.HeldItem != null && CheckItemEdibility(npc.HeldItem.Num) > 0) {
                                        if (CanUseItem(setup, npc.HeldItem)) {
                                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " took the " + ItemManager.Items[npc.HeldItem.Num].Name + "!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                            BattleProcessor.HandleItemUse(npc.HeldItem, -1, itemSetup);
                                            npc.TakeHeldItem(1);
                                        }
                                    }
                                }
                                setup.PacketStack.AddHitList(itemSetup.PacketStack);
                            }
                        }
                        break;
                    case 172: {//Incinerate
                            if (setup.Hit) {
                                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                    Client client = ((Recruit)setup.Defender).Owner;
                                    List<int> itemsToRemove = new List<int>();
                                    for (int i = 1; i <= client.Player.MaxInv; i++) {
                                        if (CheckItemEdibility(client.Player.Inventory[i].Num) > 0) {
                                            itemsToRemove.Add(i);
                                        }
                                    }
                                    if (itemsToRemove.Count > 0) {
                                        int randomItem = itemsToRemove[Server.Math.Rand(0, itemsToRemove.Count)];
                                        if (CanUseItem(setup, client.Player.Inventory[randomItem])) {
                                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " incinerated the " + ItemManager.Items[client.Player.Inventory[randomItem].Num].Name + "!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                            client.Player.TakeItemSlot(randomItem, 1, true);
                                        }
                                        Messenger.SendInventory(client);
                                    }
                                } else {
                                    MapNpc npc = (MapNpc)setup.Defender;
                                    if (npc.HeldItem != null && CheckItemEdibility(npc.HeldItem.Num) > 0) {
                                        if (CanUseItem(setup, npc.HeldItem)) {
                                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " incinerated the " + ItemManager.Items[npc.HeldItem.Num].Name + "!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                            npc.TakeHeldItem(1);
                                        }
                                    }
                                }
                            }
                        }
                        break;
                    case 178: {//Role Play
                            if (GetBattleTagArg(setup.BattleTags, "RolePlay", 1) != null) {
                                string[] typeParams = GetBattleTagArg(setup.BattleTags, "RolePlay", 1).Split(',');

                                string ability1 = typeParams[Server.Math.Rand(0, typeParams.Length / 3) * 3];
                                string ability2 = typeParams[Server.Math.Rand(0, typeParams.Length / 3) * 3 + 1];
                                string ability3 = typeParams[Server.Math.Rand(0, typeParams.Length / 3) * 3 + 2];

                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Ability1", 0, null, ability1, setup.PacketStack);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Ability2", 0, null, ability2, setup.PacketStack);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Ability3", 0, null, ability3, setup.PacketStack);

                                RemoveBattleTag(setup.BattleTags, "RolePlay");

                            } else {

                            }

                        }
                        break;
                    case 179: {//skill swap
                            if (GetBattleTagArg(setup.BattleTags, "SkillSwap", 1) != null) {

                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Ability1", 0, null, GetBattleTagArg(setup.BattleTags, "SkillSwap", 1), setup.PacketStack);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Ability2", 0, null, GetBattleTagArg(setup.BattleTags, "SkillSwap", 2), setup.PacketStack);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Ability3", 0, null, GetBattleTagArg(setup.BattleTags, "SkillSwap", 3), setup.PacketStack);

                                RemoveBattleTag(setup.BattleTags, "SkillSwap");

                            } else {

                            }
                        }
                        break;
                    case 180: {//camouflage
                            int x = setup.Attacker.X;
                            int y = setup.Attacker.Y;
                            MoveInDirection(setup.Attacker.Direction, 1, ref x, ref y);
                            if (x >= 0 && x <= setup.AttackerMap.MaxX && y >= 0 && y <= setup.AttackerMap.MaxY) {
                                Tile tile = setup.AttackerMap.Tile[x, y];
                                bool type1Changed = false;
                                if (tile.Data2 > 0) {
                                    if (tile.Type == Enums.TileType.Walkable || tile.Type == Enums.TileType.Hallway) {
                                        //set to first type
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type1", tile.Data2, null, "", setup.PacketStack);
                                        type1Changed = true;
                                    }
                                } else if (tile.Type == Enums.TileType.MobileBlock) {
                                    Enums.PokemonType terrainType = GetMobileBlockTerrainType(tile.Data1);
                                    if (terrainType != Enums.PokemonType.None) {
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type1", (int)terrainType, null, "", setup.PacketStack);
                                        type1Changed = true;
                                    }
                                }

                                if (tile.String2.IsNumeric() && tile.String2.ToInt() > 0) {
                                    //set to second type
                                    if (type1Changed == true) {
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type2", tile.String2.ToInt(), null, "", setup.PacketStack);
                                    } else {
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type1", tile.String2.ToInt(), null, "", setup.PacketStack);
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type2", 0, null, "", setup.PacketStack);
                                    }
                                }
                            }
                        }
                        break;
                    case 181: {//Secret Power
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {

                                Tile tile = setup.DefenderMap.Tile[setup.Defender.X, setup.Defender.Y];

                                int type1 = 0;
                                int type2 = 0;
                                if (tile.Data2 > 0) {
                                    if (tile.Type == Enums.TileType.Walkable || tile.Type == Enums.TileType.Hallway) {
                                        //set to first type
                                        type1 = tile.Data2;
                                    }
                                } else if (tile.Type == Enums.TileType.MobileBlock) {
                                    Enums.PokemonType terrainType = GetMobileBlockTerrainType(tile.Data1);
                                    if (terrainType != Enums.PokemonType.None) {
                                        type1 = (int)terrainType;
                                    }
                                }

                                if (tile.String2.IsNumeric() && tile.String2.ToInt() > 0) {
                                    //set to second type
                                    if (type1 != 0) {
                                        type2 = tile.String2.ToInt();
                                    } else {
                                        type1 = tile.String2.ToInt();
                                    }
                                }
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    switch ((Enums.PokemonType)type1) {
                                        case Enums.PokemonType.Bug: {
                                                ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Dark: {
                                                //blinded
                                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Blind", Server.Math.Rand(15, 20), null, "", setup.PacketStack, true);
                                            }
                                            break;
                                        case Enums.PokemonType.Dragon: {
                                                Flinch(setup.Defender, setup.Attacker, setup.DefenderMap, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Electric: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Paralyze, 1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Fighting: {
                                                ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Fire: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Flying: {
                                                //Confuse(setup.Defender, setup.Attacker, setup.DefenderMap, Server.Math.Rand(5, 11), setup.PacketStack);
                                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Confusion", Server.Math.Rand(5, 11), null, "", setup.PacketStack, true);
                                            }
                                            break;
                                        case Enums.PokemonType.Ghost: {
                                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "MoveSeal:" + Server.Math.Rand(0, 4), 0, null, "", setup.PacketStack, true);
                                            }
                                            break;
                                        case Enums.PokemonType.Grass: {
                                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Immobilize", Server.Math.Rand(5, 8), null, "", setup.PacketStack, true);
                                            }
                                            break;
                                        case Enums.PokemonType.Ground: {
                                                ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Ice: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Freeze, 1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Normal: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Sleep, Server.Math.Rand(3, 9), setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Poison: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Poison, 1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Psychic: {
                                                ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Rock: {
                                                ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Steel: {
                                                ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Water: {
                                                ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                    }
                                }

                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    switch ((Enums.PokemonType)type2) {
                                        case Enums.PokemonType.Bug: {
                                                ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Dark: {
                                                //blinded
                                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Blind", Server.Math.Rand(15, 20), null, "", setup.PacketStack, true);
                                            }
                                            break;
                                        case Enums.PokemonType.Dragon: {
                                                Flinch(setup.Defender, setup.Attacker, setup.DefenderMap, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Electric: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Paralyze, 1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Fighting: {
                                                ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Fire: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Flying: {
                                                //Confuse(setup.Defender, setup.Attacker, setup.DefenderMap, Server.Math.Rand(5, 11), setup.PacketStack);
                                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Confusion", Server.Math.Rand(5, 11), null, "", setup.PacketStack, true);
                                            }
                                            break;
                                        case Enums.PokemonType.Ghost: {
                                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "MoveSeal:" + Server.Math.Rand(0, 4), 0, null, "", setup.PacketStack, true);
                                            }
                                            break;
                                        case Enums.PokemonType.Grass: {
                                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Immobilize", Server.Math.Rand(5, 8), null, "", setup.PacketStack, true);
                                            }
                                            break;
                                        case Enums.PokemonType.Ground: {
                                                ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Ice: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Freeze, 1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Normal: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Sleep, Server.Math.Rand(3, 9), setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Poison: {
                                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Poison, 1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Psychic: {
                                                ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Rock: {
                                                ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Steel: {
                                                ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                        case Enums.PokemonType.Water: {
                                                ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                            }
                                            break;
                                    }
                                }
                            }
                        }
                        break;
                    case 192: {//flash lighting up the room
                            if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                               	AddMapStatus(setup.AttackerMap, "Flash", setup.Move.AdditionalEffectData2, "", -1, setup.PacketStack);
                            }

                        }
                        break;
                    case 193: {//halve the user's HP
                            if (setup.BattleTags.Contains("HitSomething")) {
                               	int fraction = setup.Attacker.MaxHP / 2;
                               	DamageCharacter(setup.Attacker, setup.AttackerMap, fraction, Enums.KillType.Other, setup.PacketStack, false);
                            }
                        }
                        break;
                    case 196: { //jump kick/hi jump kick recoil
                            if (!setup.BattleTags.Contains("HitSomething")) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " kept going and crashed!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                int recoil = setup.Attacker.MaxHP / 4;
                                if (recoil < 0) recoil = 0;
                                if (recoil >= setup.Attacker.HP) {
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                    setup.Cancel = true;
                                } else {
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                }
                            }
                        }
                        break;
                    case 198: { //smack down
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Grounded", 0, null, "", setup.PacketStack);
                            }
                        }
                        break;
                    case 199: {//fake out flinch
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                Flinch(setup.Defender, setup.Attacker, setup.DefenderMap, setup.PacketStack);
                            }
                        }
                        break;
                    case 202: {//struggle recoil
                            if (setup.Hit) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " was hit with recoil!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                int recoil = setup.Attacker.MaxHP / 8;
                                if (recoil < 0) recoil = 0;
                                if (recoil >= setup.Attacker.HP) {
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                    setup.Cancel = true;
                                } else {
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                }
                            }
                        }
                        break;
                    case 205: {//pay day payout
                            if (setup.Hit && setup.KnockedOut && setup.Defender.HP <= 0) {
                                if (setup.Defender.CharacterType == Enums.CharacterType.MapNpc && setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                    int payout = setup.Attacker.Level + setup.Defender.Level;
                                    setup.DefenderMap.SpawnItem(1, payout, false, false, "", setup.Defender.X, setup.Defender.Y, ((Recruit)setup.Attacker).Owner);
                                }
                            }
                        }
                        break;
                    case 223: {//surf effect
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "Slip", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 225: {//fell stinger
                            if (setup.Hit && setup.KnockedOut && setup.Defender.HP <= 0) {
                                ChangeAttackBuff(setup.Attacker, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                            }
                        }
                        break;
                    case 226: {//freeze-dry
                            if (setup.Hit && (!setup.KnockedOut || setup.Defender.HP > 0)) {
                                if (Server.Math.Rand(0, 100) < setup.Move.AdditionalEffectData2) {
                                    SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Freeze, 1, setup.PacketStack);

                                }
                            }
                        }
                        break;

                }
            } catch (Exception ex) {
                Messenger.AdminMsg("Error: MoveAdditionalEffect: " + setup.Move.AdditionalEffectData1 + " " + setup.Defender.Name, Text.Black);
                Messenger.AdminMsg(ex.ToString(), Text.Black);
            }
        }
示例#3
0
        public static void ScriptedMoveHitCharacter(BattleSetup setup)
        {
            try {
                ExtraStatus status;
                switch (setup.Move.Data1) {
                    case -6: {
                            if (setup.AttackerMap.MapType == Enums.MapType.Instanced && ((InstancedMap)setup.AttackerMap).MapBase == 1945
                                && setup.DefenderMap.MapType == Enums.MapType.Instanced && ((InstancedMap)setup.DefenderMap).MapBase == 1945) {
                                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit &&
                                    setup.Defender.CharacterType == Enums.CharacterType.Recruit) {

                                    Client attacker = ((Recruit)setup.Attacker).Owner;
                                    Client defender = ((Recruit)setup.Defender).Owner;

                                    SnowballGame attackerInstance = exPlayer.Get(attacker).SnowballGameInstance;
                                    SnowballGame defenderInstance = exPlayer.Get(defender).SnowballGameInstance;
                                    if (attackerInstance != null && defenderInstance != null
                                        && attackerInstance == defenderInstance) {

                                        attackerInstance.HandleHit(attacker, defender);
                                    }
                                }
                            }
                        }
                        break;
                    case -5: {//laser tag
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit &&
                                setup.Defender.CharacterType == Enums.CharacterType.Recruit) {

                                Client attacker = ((Recruit)setup.Attacker).Owner;
                                Client defender = ((Recruit)setup.Defender).Owner;

                                Messenger.PlayerMsg(defender, "Hit by laser by " + attacker.Player.Name + "! You lost some points!", Text.BrightRed);
                                Messenger.PlayerMsg(attacker, "You hit " + defender.Player.Name + " and gained some points!", Text.BrightRed);
                            }
                        }
                        break;
                    case -4: {//HP heal
                            HealCharacter(setup.Defender, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case -3: {//PP heal
                            HealCharacterPP(setup.Defender, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case -2: {//Full Restore
                            HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP, setup.PacketStack);
                            SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                            //Confuse(setup.Defender, setup.DefenderMap, 0, setup.PacketStack);
                        }
                        break;

                    case 1: {//burn
                            SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);

                        }
                        break;
                    case 2: {//freeze
                            SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Freeze, 1, setup.PacketStack);

                        }
                        break;
                    case 3: {//paralysis
                            SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Paralyze, 1, setup.PacketStack);

                        }
                        break;
                    case 4: {//poison
                            SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Poison, setup.Move.Data2, setup.PacketStack);

                        }
                        break;
                    case 5: {//sleep
                            SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, Enums.StatusAilment.Sleep, Server.Math.Rand(setup.Move.Data2, setup.Move.Data3), setup.PacketStack);

                        }
                        break;
                    case 6: {//confuse
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Confusion", Server.Math.Rand(5, 11), null, "", setup.PacketStack, true);
                            //Confuse(setup.Defender, setup.Attacker, setup.DefenderMap, Server.Math.Rand(5, 11), setup.PacketStack);
                        }
                        break;
                    case 7: {//flinch
                            if (Server.Math.Rand(0, 100) < setup.Move.Data2) {
                                Flinch(setup.Defender, setup.Attacker, setup.DefenderMap, setup.PacketStack);
                            }
                        }
                        break;
                    case 8: {//pause

                        }
                        break;
                    case 14: {//atk ~ self

                        }
                        break;
                    case 15: {//def ~ self

                        }
                        break;
                    case 16: {//spatk ~ self

                        }
                        break;
                    case 17: {//spdef ~ self

                        }
                        break;
                    case 18: {//speed ~ self

                        }
                        break;
                    case 19: {//acc ~ self

                        }
                        break;
                    case 20: {//eva ~ self

                        }
                        break;
                    case 21: {//atk
                            ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case 22: {//def
                            ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case 23: {//spatk
                            ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case 24: {//spdef
                            ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case 25: {//speed
                            ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case 26: {//acc
                            ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case 27: {//eva
                            ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, setup.Move.Data2, setup.PacketStack);
                        }
                        break;
                    case 28: {//recoil

                        }
                        break;
                    case 29: {//critical

                        }
                        break;
                    case 30: {//set dmg
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(setup.Defender, setup.DefenderMap, setup.Move.Data2, Enums.KillType.Player, setup.PacketStack, false);
                            } else {
                                DamageCharacter(setup.Defender, setup.DefenderMap, setup.Move.Data2, Enums.KillType.Npc, setup.PacketStack, false);
                            }
                            setup.Damage = setup.Move.Data2;
                        }
                        break;
                    case 34: {//Rest
                            if (/*!HasAbility(setup.Defender, "Insomnia") &&*/ setup.Defender.VolatileStatus.GetStatus("Sleepless") == null) {
                                setup.Defender.StatusAilment = Enums.StatusAilment.Sleep;
                                setup.Defender.StatusAilmentCounter = 4;
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " went to sleep and became healthy!", Text.BrightGreen), setup.Defender.X, setup.Defender.Y, 10);
                                if (setup.Defender.VolatileStatus.GetStatus("Nightmare") != null) {
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " couldn't recover HP by sleeping due to the nightmare!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                } else {
                                    HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP, setup.PacketStack);
                                }
                                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                    PacketBuilder.AppendStatusAilment(((Recruit)setup.Defender).Owner, setup.PacketStack);
                                } else {
                                    PacketBuilder.AppendNpcStatusAilment((MapNpc)setup.Defender, setup.PacketStack);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " couldn't fall asleep!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 36: {//sleep talk
                            if (setup.Attacker.StatusAilment == Enums.StatusAilment.Sleep && GetBattleTagArg(setup.BattleTags, "InvokedMove", 0) == null) {
                                List<int> slots = new List<int>();

                                for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                                    if (setup.Attacker.Moves[i].MoveNum > 0 && setup.moveSlot != i) {
                                        slots.Add(i);
                                    }
                                }

                                if (slots.Count > 0) {
                                    BattleSetup subSetup = new BattleSetup();
                                    subSetup.Attacker = setup.Attacker;
                                    subSetup.moveSlot = -1;
                                    subSetup.moveIndex = setup.Attacker.Moves[slots[Server.Math.Rand(0, slots.Count)]].MoveNum;

                                    subSetup.BattleTags.Add("InvokedMove");
                                    BattleProcessor.HandleAttack(subSetup);

                                    BattleProcessor.FinalizeAction(subSetup, setup.PacketStack);

                                    setup.Cancel = true;
                                    return;
                                } else {
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " couldn't pick a move!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " isn't asleep!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                        }
                        break;
                    case 39: {//OHKO
                            if (DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type1) == 0 || DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type2) == 0) {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Poor type match-up!  " + setup.Defender.Name + " took no damage!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            } else {
                                int damage = setup.Defender.HP;
                                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                    DamageCharacter(setup.Defender, setup.DefenderMap, damage, Enums.KillType.Player, setup.PacketStack, false);
                                } else {
                                    DamageCharacter(setup.Defender, setup.DefenderMap, damage, Enums.KillType.Npc, setup.PacketStack, false);
                                }
                                setup.Damage = damage;
                            }
                        }
                        break;
                    case 40: {//Heal
                            switch (setup.Move.Data2) {
                                case 1: {//Weather Dependent
                                        switch (GetCharacterWeather(setup.Attacker)) {
                                            case Enums.Weather.Sunny: {
                                                    HealCharacter(setup.Defender, setup.DefenderMap, 120, setup.PacketStack);
                                                }
                                                break;
                                            case Enums.Weather.Cloudy:
                                            case Enums.Weather.Raining:
                                            case Enums.Weather.Snowing: {
                                                    HealCharacter(setup.Defender, setup.DefenderMap, 60, setup.PacketStack);
                                                }
                                                break;
                                            case Enums.Weather.Thunder:
                                            case Enums.Weather.Snowstorm:
                                            case Enums.Weather.Sandstorm:
                                            case Enums.Weather.Hail: {
                                                    HealCharacter(setup.Defender, setup.DefenderMap, 40, setup.PacketStack);
                                                }
                                                break;
                                            case Enums.Weather.Fog:
                                            case Enums.Weather.Ashfall: {
                                                    HealCharacter(setup.Defender, setup.DefenderMap, 1, setup.PacketStack);
                                                }
                                                break;
                                            default: {
                                                    HealCharacter(setup.Defender, setup.DefenderMap, 80, setup.PacketStack);
                                                }
                                                break;

                                        }
                                    }
                                    break;
                                case 2: {//user HP dependent
                                        HealCharacter(setup.Defender, setup.DefenderMap, setup.Attacker.MaxHP / setup.Move.Data3, setup.PacketStack);
                                    }
                                    break;
                                case 3: {//Target HP dependent
                                        HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP / setup.Move.Data3, setup.PacketStack);
                                    }
                                    break;
                                case 4: {//Stockpile-dependent
                                    status = setup.Defender.VolatileStatus.GetStatus("Stockpile");
                                        if (status == null) {
                                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("But there was nothing to swallow!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                        } else {
                                            HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP * status.Counter / 3, setup.PacketStack);
                                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Stockpile", setup.PacketStack);
                                        }
                                    }
                                    break;
                                case 5: {//roost
                                        if (!CheckStatusProtection(setup.Defender, setup.DefenderMap, "Roost", true, setup.PacketStack)) {
                                            HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP / setup.Move.Data3, setup.PacketStack);
                                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Roost", 0, null, "", setup.PacketStack);
                                        }
                                    }
                                    break;

                            }
                        }
                        break;
                    case 42: {//Recover status
                            switch (setup.Move.Data2) {
                                case 1: {//Refresh; heals team members
                                        if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                            Client client = ((Recruit)setup.Defender).Owner;
                                            for (int i = 0; i < Constants.MAX_ACTIVETEAM; i++) {
                                                if (client.Player.Team[i].Loaded) {
                                                    if (!CheckStatusProtection(client.Player.Team[i], setup.DefenderMap, Enums.StatusAilment.OK.ToString(), true, setup.PacketStack)) {
                                                        client.Player.Team[i].StatusAilment = Enums.StatusAilment.OK;
                                                        client.Player.Team[i].StatusAilmentCounter = 0;
                                                    }
                                                }
                                            }
                                            PacketBuilder.AppendStatusAilment(((Recruit)setup.Defender).Owner, setup.PacketStack);
                                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("All of " + setup.Defender.Name + "'s team members were cured of their status problems!", Text.BrightCyan), setup.Defender.X, setup.Defender.Y, 10);
                                        } else {
                                            SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                                        }
                                    }
                                    break;
                                case 2: {//All status
                                        SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                                    }
                                    break;
                                case 3: {//nonvolatile status
                                        SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                                    }
                                    break;
                            }

                        }
                        break;
                    case 43: {//Heals all others; drop to 1 HP
                            switch (setup.Move.Data2) {
                                case 1: {//Healing Wish
                                        HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP, setup.PacketStack);
                                        SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                                        //Confuse(setup.Defender, setup.DefenderMap, 0, setup.PacketStack);
                                    }
                                    break;
                                case 2: {//Lunar Dance
                                        HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP, setup.PacketStack);
                                        SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                                        //Confuse(setup.Defender, setup.DefenderMap, 0, setup.PacketStack);
                                        ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                        ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                            }
                        }
                        break;
                    case 44: {//Weather change

                            if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                SetMapWeather(setup.AttackerMap, (Enums.Weather)setup.Move.Data2, setup.PacketStack);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The weather can only change in dungeons and arenas!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                        }
                        break;
                    case 45: {//Raises Two Stats
                            switch (setup.Move.Data2) {
                                case 1: {
                                        ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 2: {
                                        ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 3: {
                                        ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 4: {
                                        ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 5: {
                                        ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 6: {
                                        ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 7: {
                                        ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                            }
                            switch (setup.Move.Data3) {
                                case 1: {
                                        ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 2: {
                                        ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 3: {
                                        ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 4: {
                                        ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 5: {
                                        ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 6: {
                                        ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                                case 7: {
                                        ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                    }
                                    break;
                            }

                        }
                        break;
                    case 52: {//recycle
                            if (setup.Attacker.HeldItem == null) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " isn't holding anything!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else if (setup.Attacker.HeldItem.Num != 74 && setup.Attacker.HeldItem.Num != 75) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The " + ItemManager.Items[setup.Attacker.HeldItem.Num].Name + " isn't grimy!  It couldn't be recycled!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else if (setup.Attacker.HeldItem.Tag.IsNumeric() && setup.Attacker.HeldItem.Tag.ToInt() > 0) {
                                int grimyItem = setup.Attacker.HeldItem.Num;
                                setup.Attacker.HeldItem.Num = setup.Attacker.HeldItem.Tag.ToInt();
                                setup.Attacker.HeldItem.Tag = "";
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The " + ItemManager.Items[grimyItem].Name + " was recycled back into a " + ItemManager.Items[setup.Attacker.HeldItem.Num].Name + "!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The " + ItemManager.Items[setup.Attacker.HeldItem.Num].Name + " was too spoiled.  It couldn't be recycled.", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                PacketBuilder.AppendInventory(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            }
                        }
                        break;
                    case 53: {//level dmg
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(setup.Defender, setup.DefenderMap, setup.Attacker.Level, Enums.KillType.Player, setup.PacketStack, false);
                            } else {
                                DamageCharacter(setup.Defender, setup.DefenderMap, setup.Attacker.Level, Enums.KillType.Npc, setup.PacketStack, false);
                            }
                            setup.Damage = setup.Attacker.Level;
                        }
                        break;
                    case 54: {//random dmg
                            int rand = Server.Math.Rand((setup.Attacker.Level / 2 + 1), (setup.Attacker.Level * 3 / 2 + 1));
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(setup.Defender, setup.DefenderMap, rand, Enums.KillType.Player, setup.PacketStack, false);
                            } else {
                                DamageCharacter(setup.Defender, setup.DefenderMap, rand, Enums.KillType.Npc, setup.PacketStack, false);
                            }
                            setup.Damage = rand;
                        }
                        break;
                    case 55: {//HP fraction dmg
                            int fraction = 0;
                            if (setup.Move.Data2 == 1) {
                                fraction = setup.Defender.MaxHP / setup.Move.Data3;
                            } else {
                                fraction = setup.Defender.HP / setup.Move.Data3;
                            }
                            if (HasActiveBagItem(setup.Defender, 6, 0, 0)) fraction = 1;
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(setup.Defender, setup.DefenderMap, fraction, Enums.KillType.Player, setup.PacketStack, false);
                            } else {
                                DamageCharacter(setup.Defender, setup.DefenderMap, fraction, Enums.KillType.Npc, setup.PacketStack, false);
                            }
                            setup.Damage = fraction;
                        }
                        break;
                    case 56: {// Endeavor
                            int HPDmg = 0;
                            if (setup.Attacker.HP < setup.Defender.HP) {
                                HPDmg = setup.Defender.HP - setup.Attacker.HP;
                            }
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(setup.Defender, setup.DefenderMap, HPDmg, Enums.KillType.Player, setup.PacketStack, false);
                            } else {
                                DamageCharacter(setup.Defender, setup.DefenderMap, HPDmg, Enums.KillType.Npc, setup.PacketStack, false);
                            }
                            setup.Damage = HPDmg;
                        }
                        break;
                    case 57: {//Immobilize
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Immobilize", Server.Math.Rand(5, 8), null, "", setup.PacketStack, true);
                        }
                        break;
                    case 59: {//Leech Seed
                            if (setup.Attacker.VolatileStatus.GetStatus("LeechSeed:1") == null && setup.Defender.VolatileStatus.GetStatus("LeechSeed:0") == null && !CheckStatusProtection(setup.Defender, setup.Attacker, setup.DefenderMap, "LeechSeed:0", true, setup.PacketStack)) {
                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "LeechSeed:0", 0, setup.Attacker, "", setup.PacketStack, true);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "LeechSeed:1", 0, setup.Defender, "", setup.PacketStack, true);
                            }
                        }
                        break;
                    case 64: {//Curse
                            if (setup.Attacker.Type1 == Enums.PokemonType.Ghost || setup.Attacker.Type2 == Enums.PokemonType.Ghost) {
                                int curseDmg = GetBattleTagArg(setup.BattleTags, "Curse", 1).ToInt(-1);
                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Curse", curseDmg, null, "", setup.PacketStack, true);
                            } else {
                                ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                            }
                        }
                        break;
                    case 65: {//Defense Curl
                            ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "DefenseCurl", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 66: {//Minimize
                            ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Minimize", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 67: {//Growth
                            if (GetCharacterWeather(setup.Defender) == Enums.Weather.Sunny) {
                                ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                            } else {
                                ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                                ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                            }
                        }
                        break;
                    case 68: {//Bide, doesn't do anything here
                            //AddExtraStatus(setup.Defender, setup.DefenderMap, "Bide", 0, null, setup.PacketStack);
                        }
                        break;
                    case 69: {//stockpile
                        status = setup.Defender.VolatileStatus.GetStatus("Stockpile");
                            if (status != null) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Stockpile", status.Counter + 1, null, "", setup.PacketStack);
                            } else {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Stockpile", 1, null, "", setup.PacketStack);
                            }
                        }
                        break;
                    case 71: {//Lowers Two Stats
                            switch (setup.Move.Data2) {
                                case 1: {
                                        ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 2: {
                                        ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 3: {
                                        ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 4: {
                                        ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 5: {
                                        ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 6: {
                                        ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 7: {
                                        ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                            }
                            switch (setup.Move.Data3) {
                                case 1: {
                                        ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 2: {
                                        ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 3: {
                                        ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 4: {
                                        ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 5: {
                                        ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 6: {
                                        ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 7: {
                                        ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                                    }
                                    break;
                            }

                        }
                        break;
                    case 75: {//Present
                            int rand = GetBattleTagArg(setup.BattleTags, "Present", 1).ToInt(-1);
                            switch (rand) {
                                case 0: {
                                        HealCharacter(setup.Defender, setup.DefenderMap, 80, setup.PacketStack);
                                    }
                                    break;
                                case 1:
                                case 2:
                                case 3: {
                                        if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                            DamageCharacter(setup.Defender, setup.DefenderMap, 40 * rand, Enums.KillType.Player, setup.PacketStack, false);
                                        } else {
                                            DamageCharacter(setup.Defender, setup.DefenderMap, 40 * rand, Enums.KillType.Npc, setup.PacketStack, false);
                                        }
                                        setup.Damage = 40 * rand;
                                    }
                                    break;
                            }
                        }
                        break;
                    case 84: {//psych up
                            setup.Attacker.AttackBuff = setup.Defender.AttackBuff;
                            setup.Attacker.DefenseBuff = setup.Defender.DefenseBuff;
                            setup.Attacker.SpAtkBuff = setup.Defender.SpAtkBuff;
                            setup.Attacker.SpDefBuff = setup.Defender.SpDefBuff;
                            setup.Attacker.SpeedBuff = setup.Defender.SpeedBuff;
                            setup.Attacker.AccuracyBuff = setup.Defender.AccuracyBuff;
                            setup.Attacker.EvasionBuff = setup.Defender.EvasionBuff;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " copied " + setup.Defender.Name + "'s stat changes!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                        }
                        break;
                    case 87: {//Traps
                            bool trapPlaced = false;
                            if (setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Scripted && GetTrapType(setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Data1) != null) {
                                    //remove preexisting traps, unless it's a spikes or T-spikes trap, in which case it can stack
                                    if (setup.Move.Data2 == 17 && setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Data1 == 17 && setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].String3.ToInt() < 3) {
                                        setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].String3 = (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].String3.ToInt() + 1).ToString();
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " placed a trap!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                        trapPlaced = true;
                                    } else if (setup.Move.Data2 == 18 && setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Data1 == 18 && setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].String3.ToInt() < 2) {
                                        setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].String3 = (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].String3.ToInt() + 1).ToString();
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " placed a trap!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                        trapPlaced = true;
                                    } else {
                                        RemoveTrap(setup.AttackerMap, setup.Attacker.X, setup.Attacker.Y, setup.PacketStack);
                                    }
                                }

                                if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Walkable) {
                                    //set the trap on a walkable tile
                                    Tile tile = setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y];
                                    tile.Type = Enums.TileType.Scripted;
                                    tile.Data1 = setup.Move.Data2;
                                    tile.Data2 = 0;
                                    tile.Data3 = 2;
                                    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                        tile.String1 = ((Recruit)setup.Attacker).Owner.Player.CharID;
                                        tile.String2 = ((Recruit)setup.Attacker).Owner.Player.GuildName;
                                    } else {
                                        tile.String1 = "";
                                        tile.String2 = "";
                                    }
                                    if (setup.Move.Data2 == 17 || setup.Move.Data2 == 18) tile.String3 = "1";
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " placed a trap!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                    trapPlaced = true;
                                }
                            }

                            if (!trapPlaced) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("A trap can't be placed here!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                        }
                        break;
                    case 88: {//Teleport
                            if (setup.DefenderMap.MapType == Enums.MapType.RDungeonMap) {
                                if (GetBattleTagArg(setup.BattleTags, "Teleport", 1) != null) {
                                    //setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " warped!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                    PointWarp(setup.Defender, setup.DefenderMap, setup.PacketStack, GetBattleTagArg(setup.BattleTags, "Teleport", 1).ToInt(), GetBattleTagArg(setup.BattleTags, "Teleport", 2).ToInt());
                                } else {
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " didn't warp.", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " can only warp in mystery dungeons!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 89: {//Memento
                            ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -2, setup.PacketStack);
                            ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -2, setup.PacketStack);
                        }
                        break;
                    case 90: {//Perish Song
                            if (setup.Attacker == setup.Defender) {
                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "PerishCount", 4, null, "", setup.PacketStack, false);
                            } else {
                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "PerishCount", 3, null, "", setup.PacketStack, true);
                            }
                        }
                        break;
                    case 91: {//Future Sight
                            int damage = DamageCalculator.CalculateDamage(100, setup.Attacker.SpclAtk, setup.Attacker.Level, setup.Defender.SpclDef);
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "FutureSight", 2, null, "", setup.PacketStack);
                        }
                        break;
                    case 92: {//Doom Desire
                            //AddExtraStatus(setup.Defender, setup.DefenderMap, "FutureSight", 2, null, setup.PacketStack);
                        }
                        break;
                    case 93: {//Focus Energy
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "FocusEnergy", 3, null, "", setup.PacketStack);
                        }
                        break;
                    case 94: {//Ingrain
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Ingrain", Server.Math.Rand(5, 8), null, "", setup.PacketStack);
                        }
                        break;
                    case 95: {//Charge
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Charge", 2, null, "", setup.PacketStack);
                            ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                        }
                        break;
                    case 96: {//Accupressure
                            switch (Server.Math.Rand(0, 7)) {
                                case 0: {
                                        ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 1: {
                                        ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 2: {
                                        ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 3: {
                                        ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 4: {
                                        ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 5: {
                                        ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 6: {
                                        ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                            }
                        }
                        break;
                    case 97: {//Disable
                        status = setup.Defender.VolatileStatus.GetStatus("LastUsedMoveSlot");
                            if (status != null) {
                                //AddExtraStatus(i, "MoveSeal:" + rand, -1, 0, null, hitlist);
                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Disable", status.Counter, null, "", setup.PacketStack, true);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("But it failed on " + setup.Defender.Name + "!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 98: {//Yawn
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Yawn", 2, null, "", setup.PacketStack, true);
                        }
                        break;
                    case 99: {//Foresight
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Exposed", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 100: {//Miracle Eye
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "MiracleEye", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 101: {//Protect/Detect
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Protect", setup.Move.Data2, null, "", setup.PacketStack);
                        }
                        break;
                    case 102: {//Endure
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Endure", setup.Move.Data2, null, "", setup.PacketStack);
                        }
                        break;
                    case 103: {//Haze
                            RemoveBuffs(setup.Defender);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s stat changes were removed!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                        }
                        break;
                    case 104: {//Magnet Rise
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "MagnetRise", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 105: {//Mirror Coat
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "MirrorCoat", 2, null, "", setup.PacketStack);
                        }
                        break;
                    case 106: {//Counter
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Counter", 2, null, "", setup.PacketStack);
                        }
                        break;
                    case 107: {//Belly Drum
                            if (setup.Defender.HP > setup.Defender.MaxHP / 2) {
                                DamageCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP / 2, Enums.KillType.Other, setup.PacketStack, true);
                                ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 10, setup.PacketStack);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("But it failed!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 108: {//Safeguard
                            int duration = setup.Move.Data2;
                            if (setup.Attacker.HasActiveItem(84)) {
                                duration *= 2;
                            }
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Safeguard", duration, null, "", setup.PacketStack);
                        }
                        break;
                    case 109: {//Mist
                            int duration = setup.Move.Data2;
                            if (setup.Attacker.HasActiveItem(84)) {
                                duration *= 2;
                            }
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Mist", duration, null, "", setup.PacketStack);
                        }
                        break;
                    case 110: {//Reflect
                            int duration = setup.Move.Data2;
                            if (setup.Attacker.HasActiveItem(84)) {
                                duration *= 2;
                            }
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Reflect", duration, null, "", setup.PacketStack);
                        }
                        break;
                    case 111: {//Light Screen
                            int duration = setup.Move.Data2;
                            if (setup.Attacker.HasActiveItem(84)) {
                                duration *= 2;
                            }
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "LightScreen", duration, null, "", setup.PacketStack);
                        }
                        break;
                    case 114: {//Rage
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Rage", 10, null, "", setup.PacketStack);
                        }
                        break;
                    case 115: {//Taunt
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Taunt", 10, null, "", setup.PacketStack, true);
                        }
                        break;
                    case 116: {//Encore
                            if (setup.Defender.VolatileStatus.GetStatus("LastUsedMoveSlot") != null) {
                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Encore", 5, null, "", setup.PacketStack, true);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("But it failed on " + setup.Defender.Name + "!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 117: {//Torment
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Torment", 0, null, "", setup.PacketStack, true);
                        }
                        break;
                    case 118: {//GRUDGE
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Grudge", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 119: {//Lucky Chant
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "LuckyChant", 5, null, "", setup.PacketStack);
                        }
                        break;
                    case 120: {//Spite (deduct PP)
                        status = setup.Defender.VolatileStatus.GetStatus("LastUsedMoveSlot");
                            if (status != null) {

                                setup.Defender.Moves[status.Counter].CurrentPP -= setup.Move.Data2;
                                if (setup.Defender.Moves[status.Counter].CurrentPP < 0) {
                                    setup.Defender.Moves[status.Counter].CurrentPP = 0;
                                }
                                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                    PacketBuilder.AppendPlayerMoves(((Recruit)setup.Defender).Owner, setup.PacketStack);
                                }
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("The last move used by " + setup.Defender.Name + " lost some PP!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("But it failed on " + setup.Defender.Name + "!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 121: {//Aqua Ring
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "AquaRing", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 122: {//Wish
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Wish", 2, null, "", setup.PacketStack);
                        }
                        break;
                    case 123: {//Embargo
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Embargo", 10, null, "", setup.PacketStack, true);
                        }
                        break;
                    case 124: {//Imprison
                            int rand = Server.Math.Rand(0, 4);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "MoveSeal:" + rand, 0, null, "", setup.PacketStack, true);
                            //for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                            //	for (int i = 0; j < Constants.MAX_PLAYER_MOVES; j++) {

                            //}
                        }
                        break;
                    case 125: {//phazer
                            BlowBack(setup.Defender, setup.DefenderMap, setup.Attacker.Direction, setup.PacketStack);
                        }
                        break;
                    case 127: {//Destiny Bond
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "DestinyBond", 3, null, "", setup.PacketStack);
                        }
                        break;
                    case 129: {//psycho shift
                            int statusAilment = GetBattleTagArg(setup.BattleTags, "PsychoShift", 1).ToInt(-1);
                            int statusCounter = GetBattleTagArg(setup.BattleTags, "PsychoShift", 2).ToInt(-1);

                            if (statusAilment < 1) {

                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s status problem was shifted on to " + setup.Defender.Name + "!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                SetStatusAilment(setup.Defender, setup.Attacker, setup.DefenderMap, (Enums.StatusAilment)statusAilment, statusCounter, setup.PacketStack);
                            }
                        }
                        break;
                    case 130: {//Heal Block
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "HealBlock", 10, null, "", setup.PacketStack, true);
                        }
                        break;
                    case 131: {//Magic Coat
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "MagicCoat", 5, null, "", setup.PacketStack);
                        }
                        break;
                    case 134: {//Metal Burst
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "MetalBurst", 1, null, "", setup.PacketStack);
                        }
                        break;
                    case 137: {//Neutralized move effects
                            if (HasActiveBagItem(setup.Defender, 2, 0, (int)setup.Move.Element)) {
                                HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP / 4, setup.PacketStack);
                            }

                            if (HasAbility(setup.Defender, "Dry Skin")) {
                                if (setup.Move.Element == Enums.PokemonType.Water) {
                                    HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP / 4, setup.PacketStack);
                                }
                            }
                            if (HasAbility(setup.Defender, "Flash Fire")) {
                                if (setup.Move.Element == Enums.PokemonType.Fire) {
                                    AddExtraStatus(setup.Defender, setup.DefenderMap, "FlashFire", 0, null, "", setup.PacketStack);
                                }
                            }
                            if (HasAbility(setup.Defender, "Lightning Rod")) {
                                if (setup.Move.Element == Enums.PokemonType.Electric) {
                                    ChangeSpAtkBuff(setup.Defender, setup.DefenderMap, 1, setup.PacketStack);
                                }
                            }
                            if (HasAbility(setup.Defender, "Motor Drive")) {
                                if (setup.Move.Element == Enums.PokemonType.Electric) {
                                    ChangeSpeedBuff(setup.Defender, setup.DefenderMap, 1, setup.PacketStack);
                                }
                            }
                            if (HasAbility(setup.Defender, "Sap Sipper")) {
                                if (setup.Move.Element == Enums.PokemonType.Grass) {
                                    ChangeAttackBuff(setup.Defender, setup.DefenderMap, 1, setup.PacketStack);
                                }
                            }
                            if (HasAbility(setup.Defender, "Storm Drain")) {
                                if (setup.Move.Element == Enums.PokemonType.Water) {
                                    ChangeSpAtkBuff(setup.Defender, setup.DefenderMap, 1, setup.PacketStack);
                                }
                            }
                            if (HasAbility(setup.Defender, "Volt Absorb")) {
                                if (setup.Move.Element == Enums.PokemonType.Electric) {
                                    HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP / 4, setup.PacketStack);
                                }
                            }
                            if (HasAbility(setup.Defender, "Water Absorb")) {
                                if (setup.Move.Element == Enums.PokemonType.Water) {
                                    HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP / 4, setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 138: {//Wide Guard
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "WideGuard", setup.Move.Data2, null, "", setup.PacketStack);
                        }
                        break;
                    case 139: {//Quiver Dance
                            ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                            ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                            ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                        }
                        break;
                    case 140: {//Coil
                            ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                            ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                            ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                        }
                        break;
                    case 141: {//Shell Smash
                            ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                            ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                            ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                            ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -1, setup.PacketStack);
                            ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                        }
                        break;
                    case 144: {//Autotomize
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Autotomize", 0, null, "", setup.PacketStack);
                            ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                        }
                        break;
                    case 145: {//Shift Gear
                            ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 1, setup.PacketStack);
                            ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                        }
                        break;
                    case 147: {//swagger/flatter

                            //Confuse(setup.Defender, setup.Attacker, setup.DefenderMap, Server.Math.Rand(5, 11), setup.PacketStack);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Confusion", Server.Math.Rand(5, 11), null, "", setup.PacketStack, true);
                            switch (setup.Move.Data2) {
                                case 1: {
                                        ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 2: {
                                        ChangeDefenseBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 3: {
                                        ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 4: {
                                        ChangeSpDefBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 5: {
                                        ChangeSpeedBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 6: {
                                        ChangeAccuracyBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                                case 7: {
                                        ChangeEvasionBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                                    }
                                    break;
                            }
                        }
                        break;
                    case 148: {//Captivate
                            if (setup.Attacker.Sex == Enums.Sex.Genderless && setup.Defender.Sex == Enums.Sex.Genderless
                            || setup.Attacker.Sex == Enums.Sex.Male && setup.Defender.Sex == Enums.Sex.Female
                            || setup.Defender.Sex == Enums.Sex.Male && setup.Attacker.Sex == Enums.Sex.Female) {
                                if (HasAbility(setup.Defender, "Oblivious")) {
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " wasn't affected due to Oblivious!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                } else {
                                    ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, -2, setup.PacketStack);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " wasn't affected!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 149: {//Attract
                            if (setup.Attacker.Sex == Enums.Sex.Genderless && setup.Defender.Sex == Enums.Sex.Genderless
                            || setup.Attacker.Sex == Enums.Sex.Male && setup.Defender.Sex == Enums.Sex.Female
                            || setup.Defender.Sex == Enums.Sex.Male && setup.Attacker.Sex == Enums.Sex.Female) {
                                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Attract", Server.Math.Rand(4, 6), null, "", setup.PacketStack, true);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " wasn't affected!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 150: {//Follow
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Follow", 3, setup.Attacker, "", setup.PacketStack);
                        }
                        break;
                    case 152: {//Set Type
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Type1", setup.Move.Data2, null, "", setup.PacketStack);
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Type2", setup.Move.Data3, null, "", setup.PacketStack);
                        }
                        break;
                    case 153: {//Nullify Ability
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "GastroAcid", setup.Move.Data2, null, "", setup.PacketStack, true);
                        }
                        break;
                    case 155: {//reflect Type
                            if (GetBattleTagArg(setup.BattleTags, "ReflectType", 1) != null) {
                                string typeParams = GetBattleTagArg(setup.BattleTags, "ReflectType", 1);
                                typeParams += "," + (int)setup.Defender.Type1 + "," + (int)setup.Defender.Type2;
                                RemoveBattleTag(setup.BattleTags, "ReflectType");
                                setup.BattleTags.Add("ReflectType:" + typeParams);
                            } else {
                                setup.BattleTags.Add("ReflectType:" + (int)setup.Defender.Type1 + "," + (int)setup.Defender.Type2);
                            }
                        }
                        break;
                    case 158: {//lock on/mind reader
                            if (setup.Defender == setup.Attacker) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "SureShot", setup.Move.Data2 + 1, null, "", setup.PacketStack);
                            } else {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "SureShot", setup.Move.Data2, null, "", setup.PacketStack);
                            }
                        }
                        break;
                    case 159: {//ally switch
                            if (setup.DefenderMap.MapType == Enums.MapType.RDungeonMap) {
                                if (GetBattleTagArg(setup.BattleTags, "AllySwitchCount", 1) != null) {
                                    int count = GetBattleTagArg(setup.BattleTags, "AllySwitchCount", 1).ToInt();
                                    if (GetBattleTagArg(setup.BattleTags, "AllySwitch", count) != null) {
                                        setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " warped!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                        PointWarp(setup.Defender, setup.DefenderMap, setup.PacketStack, GetBattleTagArg(setup.BattleTags, "AllySwitch", count).ToInt(), GetBattleTagArg(setup.BattleTags, "AllySwitch", count + 1).ToInt());
                                    }
                                    RemoveBattleTag(setup.BattleTags, "AllySwitchCount");
                                    setup.BattleTags.Add("AllySwitchCount:" + (count + 2));
                                } else {
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " didn't warp.", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " can only warp in mystery dungeons!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 161: {//movement speed
                        status = setup.Defender.VolatileStatus.GetStatus("MovementSpeed");
                            if (status != null) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "MovementSpeed", status.Counter + setup.Move.Data2, null, "", setup.PacketStack);
                            } else {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "MovementSpeed", setup.Move.Data2, null, "", setup.PacketStack);
                            }
                        }
                        break;
                    case 162: {//rollcall
                            if (setup.DefenderMap.MapType == Enums.MapType.RDungeonMap) {
                                if (GetBattleTagArg(setup.BattleTags, "Rollcall", 1) != null) {
                                    //setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " warped!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                    RandomWarp(setup.Defender, setup.DefenderMap, true, setup.PacketStack, GetBattleTagArg(setup.BattleTags, "Rollcall", 1).ToInt() - 1, GetBattleTagArg(setup.BattleTags, "Rollcall", 1).ToInt() + 1, GetBattleTagArg(setup.BattleTags, "Rollcall", 2).ToInt() - 1, GetBattleTagArg(setup.BattleTags, "Rollcall", 2).ToInt() + 1);
                                } else {
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " didn't warp.", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " can only warp in mystery dungeons!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 164: {//Quick Guard
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "QuickGuard", setup.Move.Data2, null, "", setup.PacketStack);
                        }
                        break;
                    case 166: {//Stat Swap

                            switch (setup.Move.Data2) {
                                case 1: {//power Swap
                                        if (GetBattleTagArg(setup.BattleTags, "PowerSwap", 1) != null) {
                                            int atk = setup.Defender.AttackBuff;
                                            int spAtk = setup.Defender.SpAtkBuff;
                                            setup.Defender.AttackBuff = GetBattleTagArg(setup.BattleTags, "PowerSwap", 2).ToInt();
                                            setup.Defender.SpAtkBuff = GetBattleTagArg(setup.BattleTags, "PowerSwap", 3).ToInt();
                                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " received " + GetBattleTagArg(setup.BattleTags, "PowerSwap", 1) + "'s changes to Attack and Special Attack!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                            RemoveBattleTag(setup.BattleTags, "PowerSwap");
                                            setup.BattleTags.Add("PowerSwap:" + setup.Defender.Name + ":" + atk + ":" + spAtk);

                                        } else {

                                            setup.BattleTags.Add("PowerSwap:" + setup.Defender.Name + ":" + setup.Defender.AttackBuff + ":" + setup.Defender.SpAtkBuff);
                                            setup.Defender.AttackBuff = setup.Attacker.AttackBuff;
                                            setup.Defender.SpAtkBuff = setup.Attacker.SpAtkBuff;
                                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " received " + setup.Attacker.Name + "'s changes to Attack and Special Attack!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                        }
                                    }
                                    break;
                                case 2: {//guard swap
                                        if (GetBattleTagArg(setup.BattleTags, "GuardSwap", 1) != null) {
                                            int def = setup.Defender.DefenseBuff;
                                            int spDef = setup.Defender.SpDefBuff;
                                            setup.Defender.DefenseBuff = GetBattleTagArg(setup.BattleTags, "GuardSwap", 2).ToInt();
                                            setup.Defender.SpDefBuff = GetBattleTagArg(setup.BattleTags, "GuardSwap", 3).ToInt();
                                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " received " + GetBattleTagArg(setup.BattleTags, "GuardSwap", 1) + "'s changes to Defense and Special Defense!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                            RemoveBattleTag(setup.BattleTags, "GuardSwap");
                                            setup.BattleTags.Add("GuardSwap:" + setup.Defender.Name + ":" + def + ":" + spDef);

                                        } else {

                                            setup.BattleTags.Add("GuardSwap:" + setup.Defender.Name + ":" + setup.Defender.DefenseBuff + ":" + setup.Defender.SpDefBuff);
                                            setup.Defender.DefenseBuff = setup.Attacker.DefenseBuff;
                                            setup.Defender.SpDefBuff = setup.Attacker.SpDefBuff;
                                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " received " + setup.Attacker.Name + "'s changes to Defense and Special Defense!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                        }
                                    }
                                    break;
                                case 3: {//heart Swap
                                        if (GetBattleTagArg(setup.BattleTags, "HeartSwap", 1) != null) {
                                            int atk = setup.Defender.AttackBuff;
                                            int spAtk = setup.Defender.SpAtkBuff;
                                            int def = setup.Defender.DefenseBuff;
                                            int spDef = setup.Defender.SpDefBuff;
                                            int speed = setup.Defender.SpeedBuff;
                                            int acc = setup.Defender.AccuracyBuff;
                                            int eva = setup.Defender.EvasionBuff;
                                            setup.Defender.AttackBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 2).ToInt();
                                            setup.Defender.SpAtkBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 3).ToInt();
                                            setup.Defender.DefenseBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 4).ToInt();
                                            setup.Defender.SpDefBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 5).ToInt();
                                            setup.Defender.SpeedBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 6).ToInt();
                                            setup.Defender.AccuracyBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 7).ToInt();
                                            setup.Defender.EvasionBuff = GetBattleTagArg(setup.BattleTags, "HeartSwap", 8).ToInt();
                                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " received " + GetBattleTagArg(setup.BattleTags, "HeartSwap", 1) + "'s stat changes!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                            RemoveBattleTag(setup.BattleTags, "HeartSwap");
                                            setup.BattleTags.Add("PowerSwap:" + setup.Defender.Name + ":" + atk + ":" + spAtk + ":" + def + ":" + spDef + ":" + speed + ":" + acc + ":" + eva);

                                        } else {

                                            setup.BattleTags.Add("HeartSwap:" + setup.Defender.Name + ":" + setup.Defender.AttackBuff + ":" + setup.Defender.SpAtkBuff + ":" +
                                                setup.Defender.DefenseBuff + ":" + setup.Defender.SpDefBuff + ":" + setup.Defender.SpeedBuff + ":" + setup.Defender.AccuracyBuff + ":" + setup.Defender.EvasionBuff);
                                            setup.Defender.AttackBuff = setup.Attacker.AttackBuff;
                                            setup.Defender.SpAtkBuff = setup.Attacker.SpAtkBuff;
                                            setup.Defender.DefenseBuff = setup.Attacker.DefenseBuff;
                                            setup.Defender.SpDefBuff = setup.Attacker.SpDefBuff;
                                            setup.Defender.SpeedBuff = setup.Attacker.SpeedBuff;
                                            setup.Defender.AccuracyBuff = setup.Attacker.AccuracyBuff;
                                            setup.Defender.EvasionBuff = setup.Attacker.EvasionBuff;
                                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " received " + setup.Attacker.Name + "'s stat changes!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                        }
                                    }
                                    break;
                            }
                        }
                        break;
                    case 167: {//substitute
                            if (setup.Defender.HP > setup.Defender.MaxHP / 4) {
                                if (setup.Defender.VolatileStatus.GetStatus("Substitute") == null) {
                                    setup.Defender.HP -= setup.Defender.MaxHP / 4;
                                    AddExtraStatus(setup.Defender, setup.DefenderMap, "Substitute", setup.Defender.MaxHP / 4, null, "", setup.PacketStack);
                                } else {
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " already has a substitute up!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " was too weak to make a substitute!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 168: {//Telekinesis
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Telekinesis", setup.Move.Data2, null, "", setup.PacketStack);
                        }
                        break;
                    case 170: {// Final Gambit
                            int HPDmg = 0;
                            if (setup.Attacker.HP > 0) {
                                HPDmg = setup.Attacker.HP - 1;
                            }
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(setup.Defender, setup.DefenderMap, HPDmg, Enums.KillType.Player, setup.PacketStack, false);
                            } else {
                                DamageCharacter(setup.Defender, setup.DefenderMap, HPDmg, Enums.KillType.Npc, setup.PacketStack, false);
                            }
                            setup.Damage = HPDmg;
                        }
                        break;
                    case 173: {//Nightmare
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Nightmare", 0, null, "", setup.PacketStack, true);
                        }
                        break;
                    case 174: {//Trick Room
                            if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                if (setup.AttackerMap.TempStatus.GetStatus("TrickRoom") != null) {
                                    RemoveMapStatus(setup.AttackerMap, "TrickRoom", setup.PacketStack);
                                } else {
                                    AddMapStatus(setup.AttackerMap, "TrickRoom", setup.Move.Data2, "", -1, setup.PacketStack);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The effect of Trick Room only works in dungeons and arenas!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 175: {//Simple Beam
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability1", 0, null, "Simple", setup.PacketStack, true);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability2", 0, null, "None", setup.PacketStack, true);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability3", 0, null, "None", setup.PacketStack, true);
                        }
                        break;
                    case 176: {//Entrainment
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability1", 0, null, setup.Attacker.Ability1, setup.PacketStack, true);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability2", 0, null, setup.Attacker.Ability2, setup.PacketStack, true);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability3", 0, null, setup.Attacker.Ability3, setup.PacketStack, true);
                        }
                        break;
                    case 177: {//Worry Seed
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability1", 0, null, "Insomnia", setup.PacketStack, true);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability2", 0, null, "None", setup.PacketStack, true);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability3", 0, null, "None", setup.PacketStack, true);
                        }
                        break;
                    case 178: {//role play
                            if (GetBattleTagArg(setup.BattleTags, "RolePlay", 1) != null) {
                                string typeParams = GetBattleTagArg(setup.BattleTags, "RolePlay", 1);
                                typeParams += "," + setup.Defender.Ability1 + "," + setup.Defender.Ability2 + "," + setup.Defender.Ability3;
                                RemoveBattleTag(setup.BattleTags, "RolePlay");
                                setup.BattleTags.Add("RolePlay:" + typeParams);
                            } else {
                                setup.BattleTags.Add("RolePlay:" + setup.Defender.Ability1 + "," + setup.Defender.Ability2 + "," + setup.Defender.Ability3);
                            }
                        }
                        break;
                    case 179: {//skill swap
                            if (GetBattleTagArg(setup.BattleTags, "SkillSwap", 1) != null) {
                                string ability1 = setup.Defender.Ability1;
                                string ability2 = setup.Defender.Ability2;
                                string ability3 = setup.Defender.Ability3;

                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Ability1", 0, null, GetBattleTagArg(setup.BattleTags, "SkillSwap", 1), setup.PacketStack);
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Ability2", 0, null, GetBattleTagArg(setup.BattleTags, "SkillSwap", 2), setup.PacketStack);
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Ability3", 0, null, GetBattleTagArg(setup.BattleTags, "SkillSwap", 3), setup.PacketStack);

                                RemoveBattleTag(setup.BattleTags, "SkillSwap");
                                setup.BattleTags.Add("SkillSwap:" + ability1 + ":" + ability2 + ":" + ability3);

                            } else {

                                setup.BattleTags.Add("SkillSwap:" + setup.Defender.Ability1 + ":" + setup.Defender.Ability2 + ":" + setup.Defender.Ability3);
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Ability1", 0, null, setup.Attacker.Ability1, setup.PacketStack);
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Ability2", 0, null, setup.Attacker.Ability2, setup.PacketStack);
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Ability3", 0, null, setup.Attacker.Ability3, setup.PacketStack);
                            }
                        }
                        break;
                    case 182: {//snatch
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Snatch", setup.Move.Data2, null, "", setup.PacketStack, true);
                        }
                        break;
                    case 183: {//Wonder Room
                            if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                if (setup.AttackerMap.TempStatus.GetStatus("WonderRoom") != null) {
                                    RemoveMapStatus(setup.AttackerMap, "WonderRoom", setup.PacketStack);
                                } else {
                                    AddMapStatus(setup.AttackerMap, "WonderRoom", setup.Move.Data2, "", -1, setup.PacketStack);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The effect of Wonder Room only works in dungeons and arenas!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 184: {//Magic Room
                            if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                if (setup.AttackerMap.TempStatus.GetStatus("MagicRoom") != null) {
                                    RemoveMapStatus(setup.AttackerMap, "MagicRoom", setup.PacketStack);
                                } else {
                                    AddMapStatus(setup.AttackerMap, "MagicRoom", setup.Move.Data2, "", -1, setup.PacketStack);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The effect of Magic Room only works in dungeons and arenas!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 185: {//Gravity
                            if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                if (setup.AttackerMap.TempStatus.GetStatus("Gravity") != null) {

                                } else {
                                    AddMapStatus(setup.AttackerMap, "Gravity", setup.Move.Data2, "", -1, setup.PacketStack);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The effect of Gravity only works in dungeons and arenas!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 188: {//foe-seal
                            int rand = Server.Math.Rand(0, 4);
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "MoveSeal:" + rand, 0, null, "", setup.PacketStack, true);
                            int rand2 = Server.Math.Rand(0, 3);
                            if (rand2 == rand) rand = 3;
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "MoveSeal:" + rand2, 0, null, "", setup.PacketStack, true);
                            //for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                            //	for (int i = 0; j < Constants.MAX_PLAYER_MOVES; j++) {

                            //}
                        }
                        break;
                    case 189: {//baton pass
                            setup.Defender.AttackBuff = setup.Attacker.AttackBuff;
                            setup.Defender.DefenseBuff = setup.Attacker.DefenseBuff;
                            setup.Defender.SpeedBuff = setup.Attacker.SpeedBuff;
                            setup.Defender.SpAtkBuff = setup.Attacker.SpAtkBuff;
                            setup.Defender.SpDefBuff = setup.Attacker.SpDefBuff;
                            setup.Defender.AccuracyBuff = setup.Attacker.AccuracyBuff;
                            setup.Defender.EvasionBuff = setup.Attacker.EvasionBuff;

                            RemoveAllBondedExtraStatus(setup.Defender, setup.DefenderMap, setup.PacketStack, false);

                            List<ExtraStatus> passedStatus = GetTeamStatus(setup.Defender);

                            setup.Defender.VolatileStatus.Clear();

                            foreach (ExtraStatus extraStatus in passedStatus) {
                                setup.Defender.VolatileStatus.Add(extraStatus);
                            }

                            for (int i = 0; i < setup.Attacker.VolatileStatus.Count; i++ ) {
                                if (!IsBondedStatus(setup.Attacker.VolatileStatus[i].Name) && !IsTeamStatus(setup.Attacker.VolatileStatus[i].Name)) {
                                    setup.Defender.VolatileStatus.Add(setup.Attacker.VolatileStatus[i]);
                                }
                            }

                            RefreshCharacterTraits(setup.Defender, setup.DefenderMap, setup.PacketStack);

                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " passed its stat changes and special effects to " + setup.Defender.Name + "!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                        }
                        break;
                    case 190: {//move-invoking moves
                            if (GetBattleTagArg(setup.BattleTags, "InvokedMove", 0) == null) {
                                int moveIndex = -1;

                                switch (setup.Move.Data2) {
                                   	case 1: {//mirror move/copycat
                                        status = setup.Attacker.VolatileStatus.GetStatus("LastMoveHitBy");

                                            if (status != null) {
                                                moveIndex = status.Counter;
                                            }
                                   		}
                                   		break;
                                   	case 2: {//assist - calls a move from the party
                                            if (GetBattleTagArg(setup.BattleTags, "Assist", 1) != null) {
                                                //Messenger.AdminMsg(GetBattleTagArg(setup.BattleTags, "Assist", 1), Text.Black);
                                                string[] possibleMoves = GetBattleTagArg(setup.BattleTags, "Assist", 1).Split(',');
                                                moveIndex = possibleMoves[Server.Math.Rand(0, possibleMoves.Length)].ToInt();
                                            }
                                   		}
                                   		break;
                                   	case 3: {//me first - calls a move from the enemies
                                            if (GetBattleTagArg(setup.BattleTags, "MeFirst", 1) != null) {
                                                //Messenger.AdminMsg(GetBattleTagArg(setup.BattleTags, "Assist", 1), Text.Black);
                                                string[] possibleMoves = GetBattleTagArg(setup.BattleTags, "MeFirst", 1).Split(',');
                                                moveIndex = possibleMoves[Server.Math.Rand(0, possibleMoves.Length)].ToInt();
                                            }
                                   		}
                                   		break;
                                   	case 4: {//nature power
                                            Tile tile = setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y];

                                            int type1 = 0;
                                            int type2 = 0;
                                            if (tile.Data2 > 0) {
                                                if (tile.Type == Enums.TileType.Walkable || tile.Type == Enums.TileType.Hallway) {
                                                    //set to first type
                                                    type1 = tile.Data2;
                                                }
                                            } else if (tile.Type == Enums.TileType.MobileBlock) {
                                                Enums.PokemonType terrainType = GetMobileBlockTerrainType(tile.Data1);
                                                if (terrainType != Enums.PokemonType.None) {
                                                    type1 = (int)terrainType;
                                                }
                                            }

                                            if (tile.String2.IsNumeric() && tile.String2.ToInt() > 0) {
                                                //set to second type
                                                if (type1 != 0) {
                                                    type2 = tile.String2.ToInt();
                                                } else {
                                                    type1 = tile.String2.ToInt();
                                                }
                                            }

                                            switch ((Enums.PokemonType)type1) {
                                                case Enums.PokemonType.Bug: {
                                                        moveIndex = 616; //quiver dance
                                                    }
                                                    break;
                                                case Enums.PokemonType.Dark: {
                                                        moveIndex = 672; //night daze
                                                    }
                                                    break;
                                                case Enums.PokemonType.Dragon: {
                                                        moveIndex = 457; //draco meteor
                                                    }
                                                    break;
                                                case Enums.PokemonType.Electric: {
                                                        moveIndex = 13; //thunder
                                                    }
                                                    break;
                                                case Enums.PokemonType.Fighting: {
                                                        moveIndex = 70; //aura sphere
                                                    }
                                                    break;
                                                case Enums.PokemonType.Fire: {
                                                        moveIndex = 95; //fire blast
                                                    }
                                                    break;
                                                case Enums.PokemonType.Flying: {
                                                        moveIndex = 675; //hurricane
                                                    }
                                                    break;
                                                case Enums.PokemonType.Ghost: {
                                                        moveIndex = 162; //night shade
                                                    }
                                                    break;
                                                case Enums.PokemonType.Grass: {
                                                        moveIndex = 416; //spore
                                                    }
                                                    break;
                                                case Enums.PokemonType.Ground: {
                                                        moveIndex = 15; //earthquake
                                                    }
                                                    break;
                                                case Enums.PokemonType.Ice: {
                                                        moveIndex = 74; //blizzard
                                                    }
                                                    break;
                                                case Enums.PokemonType.Normal: {
                                                        moveIndex = 49; //tri attack
                                                    }
                                                    break;
                                                case Enums.PokemonType.Poison: {
                                                        moveIndex = 622; //coil
                                                    }
                                                    break;
                                                case Enums.PokemonType.Psychic: {
                                                        moveIndex = 110; //light screen
                                                    }
                                                    break;
                                                case Enums.PokemonType.Rock: {
                                                        moveIndex = 374; //rock slide
                                                    }
                                                    break;
                                                case Enums.PokemonType.Steel: {
                                                        moveIndex = 319; //metal burst
                                                    }
                                                    break;
                                                case Enums.PokemonType.Water: {
                                                        moveIndex = 205; //hydro pump
                                                    }
                                                    break;
                                                default: {
                                                        moveIndex = 46; //swift
                                                    }
                                                    break;
                                            }

                                   		}
                                   		break;

                                }

                                if (moveIndex > 0 && IsInvokableMove(moveIndex)) {
                                    BattleSetup subSetup = new BattleSetup();
                                    subSetup.Attacker = setup.Attacker;
                                    subSetup.moveSlot = -1;

                                    subSetup.moveIndex = moveIndex;

                                    subSetup.BattleTags.Add("InvokedMove");
                                    BattleProcessor.HandleAttack(subSetup);

                                    BattleProcessor.FinalizeAction(subSetup, setup.PacketStack);

                                    setup.Cancel = true;
                                    return;
                                } else {
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But it failed!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But it failed!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 191: {//invisible

                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Invisible", setup.Move.Data2, null, "", setup.PacketStack, true);

                        }
                        break;
                    case 194: {//HP to 1
                            if (setup.Defender.Level > setup.Attacker.Level) {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s level is too high to be affected!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            } else {
                                int dmg = setup.Defender.HP - 1;
                                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                    DamageCharacter(setup.Defender, setup.DefenderMap, dmg, Enums.KillType.Player, setup.PacketStack, false);
                                } else {
                                    DamageCharacter(setup.Defender, setup.DefenderMap, dmg, Enums.KillType.Npc, setup.PacketStack, false);
                                }
                                setup.Damage = dmg;
                            }
                        }
                        break;
                    case 195: {//pounce
                            if (setup.AttackerMap.Moral == Enums.MapMoral.None || setup.Attacker == setup.Defender) {
                                if (GetBattleTagArg(setup.BattleTags, "Pounce", 1) != null) {
                                    PointWarp(setup.Defender, setup.DefenderMap, setup.PacketStack, GetBattleTagArg(setup.BattleTags, "Pounce", 1).ToInt(), GetBattleTagArg(setup.BattleTags, "Pounce", 2).ToInt());
                                }
                                Pounce(setup.Defender, setup.DefenderMap, setup.Attacker.Direction, true, false, setup.PacketStack);
                            }
                        }
                        break;
                    case 197: {//sky drop kidnapping phase
                            if (setup.Attacker.VolatileStatus.GetStatus("SkyDrop:1") == null && setup.Defender.VolatileStatus.GetStatus("SkyDrop:0") == null) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "SkyDrop:0", 5, setup.Attacker, "", setup.PacketStack);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "SkyDrop:1", -1, setup.Defender, "", setup.PacketStack);
                            }
                        }
                        break;
                    case 200: {//quash
                            if (setup.Defender.AttackTimer == null || setup.Defender.AttackTimer.Tick < Core.GetTickCount().Tick) {
                                setup.Defender.AttackTimer = new TickCount(Core.GetTickCount().Tick);
                            }
                            setup.Defender.AttackTimer = new TickCount(setup.Defender.AttackTimer.Tick + 4000);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s attacks were postponed!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                        }
                        break;
                    case 201: {//after you

                                    List<int> moves = new List<int>();

                                    for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                                        if (IsInvokableMove(setup.Defender.Moves[i].MoveNum)) {
                                            moves.Add(setup.Defender.Moves[i].MoveNum);
                                        }
                                    }
                                    BattleSetup groupSetup = new BattleSetup();
                                    groupSetup.Attacker = setup.Defender;
                                    groupSetup.moveSlot = -1;

                                    if (moves.Count > 0) {
                                        int rand = Server.Math.Rand(0, moves.Count);

                                        groupSetup.moveIndex = moves[rand];
                                    } else {
                                        groupSetup.moveIndex = 466;
                                    }

                                        groupSetup.BattleTags.Add("OrderedMove");

                                        BattleProcessor.HandleAttack(groupSetup);

                                        BattleProcessor.FinalizeAction(groupSetup, setup.PacketStack);

                        }
                        break;
                    case 204: {//pain split
                            if (GetBattleTagArg(setup.BattleTags, "PainSplit", 1) != null) {
                                int hp = GetBattleTagArg(setup.BattleTags, "PainSplit", 1).ToInt();
                                if (hp >= setup.Defender.HP) {
                                    HealCharacter(setup.Defender, setup.DefenderMap, hp - setup.Defender.HP, setup.PacketStack);
                                } else {
                                    DamageCharacter(setup.Defender, setup.DefenderMap, setup.Defender.HP - hp, Enums.KillType.Player, setup.PacketStack, true);
                                }
                            }
                        }
                        break;
                    case 206: {//conversion
                            if (setup.Move.Data2 == 1) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Conversion", 0, null, "", setup.PacketStack);
                                setup.BattleTags.Add("Conversion");
                            } else if (setup.Move.Data2 == 2) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Conversion2", 0, null, "", setup.PacketStack);
                            }
                        }
                        break;
                    case 207: {//rebound
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Rebound", 10, null, "", setup.PacketStack);
                        }
                        break;
                    case 208: {//Power Trick
                            int atk, def;
                            if (setup.Defender.VolatileStatus.GetStatus("ProxyAttack") != null) {
                                atk = setup.Defender.VolatileStatus.GetStatus("ProxyAttack").Counter;
                            } else {
                                atk = setup.Defender.Atk;
                            }
                            if (setup.Defender.VolatileStatus.GetStatus("ProxyDefense") != null) {
                                def = setup.Defender.VolatileStatus.GetStatus("ProxyDefense").Counter;
                            } else {
                                def = setup.Defender.Def;
                            }

                            AddExtraStatus(setup.Defender, setup.DefenderMap, "ProxyAttack", def, null, "", setup.PacketStack);
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "ProxyDefense", atk, null, "", setup.PacketStack);

                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " swapped its Attack and Defense!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);

                        }
                        break;
                    case 209: {//stat split
                            int stat = 0, special = 0;
                            if (GetBattleTagArg(setup.BattleTags, "StatSplit", 0) != null) {
                                stat = GetBattleTagArg(setup.BattleTags, "StatSplit", 1).ToInt();
                                special = GetBattleTagArg(setup.BattleTags, "StatSplit", 2).ToInt();
                            }
                            if (setup.Move.Data2 == 1) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "ProxyAttack", stat, null, "", setup.PacketStack);
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "ProxySpAtk", special, null, "", setup.PacketStack);
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Attack and Sp. Attack was shared!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            } else if (setup.Move.Data2 == 2) {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "ProxyDefense", stat, null, "", setup.PacketStack);
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "ProxySpDef", special, null, "", setup.PacketStack);
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Defense and Sp. Defense was shared!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 210: {//nonvolatile status cure with immunity
                            if (setup.Defender.StatusAilment == (Enums.StatusAilment)setup.Move.Data2) {
                                SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                            } else {
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "Status Guard", 10, null, setup.Move.Data2.ToString(), setup.PacketStack);
                            }
                        }
                        break;
                    case 212: {//sketch
                            if (setup.moveSlot >= 0 && setup.moveSlot < Constants.MAX_PLAYER_MOVES) {
                                if (setup.Attacker.Moves[setup.moveSlot].MoveNum == 435) {
                                    for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                                        int moveNum = setup.Defender.Moves[i].MoveNum;
                                        if (moveNum <= 0 || moveNum == 435) {
                                            setup.Attacker.Moves[i].MoveNum = -1;
                                            setup.Attacker.Moves[i].MaxPP = -1;
                                            setup.Attacker.Moves[i].CurrentPP = -1;
                                            setup.Attacker.Moves[i].Sealed = false;
                                        } else {
                                            setup.Attacker.Moves[i].MoveNum = moveNum;
                                            setup.Attacker.Moves[i].MaxPP = MoveManager.Moves[moveNum].MaxPP;
                                            setup.Attacker.Moves[i].CurrentPP = setup.Attacker.Moves[i].MaxPP;
                                            setup.Attacker.Moves[i].Sealed = false;
                                        }
                                    }
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " sketched " + setup.Defender.Name + "'s moves!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                        RefreshCharacterMoves(setup.Attacker, setup.AttackerMap, setup.PacketStack);
                                    }
                                }
                            }
                        }
                        break;
                    case 213: {//shocker
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Shocker", 10, null, "", setup.PacketStack);
                        }
                        break;
                    case 214: {//pierce
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Pierce", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 215: {//longtoss
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Longtoss", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 216: {//stayaway
                            AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Immobilize", Server.Math.Rand(5, 8), null, "", setup.PacketStack, true);
                            WarpToStairs(setup.Defender, setup.DefenderMap, setup.PacketStack, 1);
                        }
                        break;
                    case 218: {//bestow
                            //check to see if there's room in players' inventory to accept item
                            bool willAccept = true;
                            if (setup.Defender.HeldItem != null) {
                                willAccept = false;
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name+" is already holding something!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                            if (setup.Attacker.HeldItem == null) {
                                willAccept = false;
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name+" isn't holding anything to bestow!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                            if (willAccept && ItemManager.Items[setup.Attacker.HeldItem.Num].Bound) {
                                willAccept = false;
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name+" can't bestow its item!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            }
                            if (willAccept && setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                if (((Recruit)setup.Defender).Owner.Player.FindInvSlot(setup.Attacker.HeldItem.Num, setup.Attacker.HeldItem.Amount) == -1) {
                                    willAccept = false;
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name+" has no more room to accept the item!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                }
                            }
                            if (willAccept) {
                                setup.Defender.GiveHeldItem(setup.Attacker.HeldItem.Num, setup.Attacker.HeldItem.Amount, setup.Attacker.HeldItem.Tag, setup.Attacker.HeldItem.Sticky);
                                setup.Attacker.TakeHeldItem(setup.Attacker.HeldItem.Amount);
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " received " + setup.Attacker.Name + "'s " + ItemManager.Items[setup.Defender.HeldItem.Num].Name + "!", Text.BrightGreen), setup.Defender.X, setup.Defender.Y, 10);
                            }
                        }
                        break;
                    case 219: {//nonvolatile status cure
                            if (setup.Defender.StatusAilment == (Enums.StatusAilment)setup.Move.Data2) {
                                SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                            }
                        }
                        break;
                    case 220: {//Increases Atk and SpAtk by 2 (all power up orb)
                            ChangeAttackBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                            ChangeSpAtkBuff(setup.Defender, setup.Attacker, setup.DefenderMap, 2, setup.PacketStack);
                        }
                        break;
                    case 221: {//health orb
                            int duration = setup.Move.Data2;
                            if (setup.Attacker.HasActiveItem(84)) {
                                duration *= 2;
                            }
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Safeguard", duration, null, "", setup.PacketStack);
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "Mist", duration, null, "", setup.PacketStack);
                        }
                        break;
                    case 222: {//recovery orb
                            SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                            RemoveBuffs(setup.Defender);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s stat changes were removed!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                        }
                        break;
                    case 227: {//gift
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit && setup.Defender.CharacterType == Enums.CharacterType.MapNpc) {
                                Recruit recruit = (Recruit)setup.Attacker;
                                MapNpc npc = (MapNpc)setup.Defender;

                                bool skipRecruit = false;

                                if (!setup.DefenderMap.RecruitEnabled) {
                                    skipRecruit = true;
                                }
                                if (NpcManager.Npcs[npc.Num].RecruitRate == 0) skipRecruit = true;

                                if (recruit.Owner.Player.RequestedRecruit != null) skipRecruit = true;

                                if (setup.Attacker.Level <= npc.Level) skipRecruit = true;

                                int openSlot = recruit.Owner.Player.FindOpenTeamSlot();
                                if (openSlot == -1)
                                    skipRecruit = true;

                                    int bonus = recruit.Owner.Player.GetRecruitBonus(npc);
                                    int recruitRate = NpcManager.Npcs[npc.Num].RecruitRate;

                                if (!skipRecruit && (recruitRate + bonus) > 0)
                                {

                                    setup.DefenderMap.ActiveNpc[npc.MapSlot] = new MapNpc(npc.MapID, npc.MapSlot);
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, TcpPacket.CreatePacket("npcdead", npc.MapSlot));
                                    recruit.Owner.Player.AddToRequested(npc);
                                    recruit.Owner.Player.TakeItem(setup.Move.Data2, 1);
                                }
                                else
                                {
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " can't be recruited here!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                                }
                            }

                        }
                        break;
                }
            } catch (Exception ex) {
                Messenger.AdminMsg("Error: ScriptedMoveHitCharacter", Text.Black);
            }
        }
示例#4
0
        public static void AfterMoveHits(BattleSetup setup)
        {
            int point = 0;
            try {
                ExtraStatus status;
                //if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                //	if (Ranks.IsAllowed(((Recruit)setup.Defender).Owner, Enums.Rank.Moniter)) {
                //		Messenger.PlayerMsg(((Recruit)setup.Defender).Owner, "HP: " + setup.Attacker.HP, Text.BrightRed);
                //	}
                //}
                if (setup.Hit && setup.Defender != null) {

                    for (int i = 1; i < 6; i++) {
                        if (Server.Math.Rand(0, 5) == 0) {
                            if (HasActiveBagItem(setup.Defender, 10, 0, i) && setup.Attacker.CharacterType != setup.Defender.CharacterType) {
                                if (i == 5) {
                                    SetStatusAilment(setup.Attacker, setup.AttackerMap, (Enums.StatusAilment)i, Server.Math.Rand(2, 4), setup.PacketStack);
                                } else {
                                    SetStatusAilment(setup.Attacker, setup.AttackerMap, (Enums.StatusAilment)i, 1, setup.PacketStack);
                                }
                            }
                        }
                    }

                    for (int i = 1; i < 11; i++) {
                        if (Server.Math.Rand(0, 5) == 0) {
                            if (HasActiveBagItem(setup.Defender, 11, 0, i) && setup.Attacker.CharacterType != setup.Defender.CharacterType) {
                                switch (i) {
                                    case 1:
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Immobilize", 5, null, "", setup.PacketStack);
                                        break;
                                    case 2:
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Confusion", 10, null, "", setup.PacketStack);
                                        break;
                                    case 3:
                                        if (setup.moveSlot > -1 && setup.moveSlot < 4) {
                                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "MoveSeal:" + setup.moveSlot, 0, null, "", setup.PacketStack);
                                        }
                                        break;
                                    case 4:
                                        ExtraStatus exStatus = setup.Attacker.VolatileStatus.GetStatus("MovementSpeed");
                                        if (exStatus != null) {
                                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "MovementSpeed", exStatus.Counter - 1, null, "", setup.PacketStack);
                                        } else {
                                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "MovementSpeed", -1, null, "", setup.PacketStack);
                                        }
                                        break;
                                    case 5:
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Blind", 15, null, "", setup.PacketStack);
                                        break;
                                    case 6:
                                        Flinch(setup.Attacker, null, setup.AttackerMap, setup.PacketStack);
                                        break;
                                    case 7:
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "PerishCount", 4, null, "", setup.PacketStack);
                                        break;
                                    case 8:
                                        if (setup.Attacker.Sex == Enums.Sex.Genderless && setup.Defender.Sex == Enums.Sex.Genderless
                                            || setup.Attacker.Sex == Enums.Sex.Male && setup.Defender.Sex == Enums.Sex.Female
                                            || setup.Defender.Sex == Enums.Sex.Male && setup.Attacker.Sex == Enums.Sex.Female) {
                                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "Attract", 10, null, "", setup.PacketStack);
                                        }
                                        break;
                                    case 9:
                                        AddExtraStatus(setup.Defender, setup.DefenderMap, "Invisible", 10, null, "", setup.PacketStack);
                                        break;
                                    case 10:
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Nightmare", 0, null, "", setup.PacketStack);
                                        break;
                                }
                            }
                        }
                    }

                    //move hit consequences like static, shadow tag, etc.
                    CheckAfterMoveHitAbility(setup);

                    if (setup.Defender.HP <= 0 && setup.KnockedOut == false) {
                        setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " barely endured the hit!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    }

                    if (setup.Damage > 0 && setup.Hit) {
                        //Ruby/Sapphire Plate
                        if (setup.Defender.HasActiveItem(159) && setup.Move.Element != Enums.PokemonType.None && setup.Move.MoveCategory == Enums.MoveCategory.Physical
                            || setup.Defender.HasActiveItem(178) && setup.Move.Element != Enums.PokemonType.None && setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Its power rebounded!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP) / 2;
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }

                        //Jaboca/Rowap
                        status = setup.Defender.VolatileStatus.GetStatus("AttackReturn");
                        if (status != null) {
                            if (setup.Move.MoveCategory == Enums.MoveCategory.Physical && status.Counter == 0
                                || setup.Move.MoveCategory == Enums.MoveCategory.Special && status.Counter == 1) {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Its power rebounded to everyone!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int dmg = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP) / 2;

                            TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 6, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, true, false, false);

                            for (int i = 0; i < targets.Foes.Count; i++) {
                                if (dmg >= targets.Foes[i].HP) {
                                    DamageCharacter(targets.Foes[i], MapManager.RetrieveActiveMap(targets.Foes[i].MapID), dmg, Enums.KillType.Other, setup.PacketStack, true);
                                    setup.Cancel = true;
                                } else {
                                    DamageCharacter(targets.Foes[i], MapManager.RetrieveActiveMap(targets.Foes[i].MapID), dmg, Enums.KillType.Other, setup.PacketStack, true);
                                }
                            }
                            }
                        }

                        //rocky helmet
                        if (setup.Defender.HasActiveItem(482) && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " was jurt by the Rocky Helmet!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP) / 4;
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }

                        //sticky barb
                        if (MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y) &&
                            (setup.Defender.HasActiveItem(134) || setup.Attacker.HasActiveItem(134))) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " was hurt by the Sticky Barb!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = setup.Attacker.HP / 16;
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }

                        //Type-reflect Plates
                        if (setup.Defender.HasActiveItem(295) && setup.Move.Element == Enums.PokemonType.Rock
                            || setup.Defender.HasActiveItem(296) && setup.Move.Element == Enums.PokemonType.Ground
                            || setup.Defender.HasActiveItem(297) && setup.Move.Element == Enums.PokemonType.Steel
                            || setup.Defender.HasActiveItem(416) && setup.Move.Element == Enums.PokemonType.Ice
                            || setup.Defender.HasActiveItem(417) && setup.Move.Element == Enums.PokemonType.Dragon
                            || setup.Defender.HasActiveItem(418) && setup.Move.Element == Enums.PokemonType.Dark
                            || setup.Defender.HasActiveItem(419) && setup.Move.Element == Enums.PokemonType.Fighting
                            || setup.Defender.HasActiveItem(420) && setup.Move.Element == Enums.PokemonType.Fire
                            || setup.Defender.HasActiveItem(423) && setup.Move.Element == Enums.PokemonType.Bug
                            || setup.Defender.HasActiveItem(424) && setup.Move.Element == Enums.PokemonType.Grass
                            || setup.Defender.HasActiveItem(425) && setup.Move.Element == Enums.PokemonType.Psychic
                            || setup.Defender.HasActiveItem(426) && setup.Move.Element == Enums.PokemonType.Flying
                            || setup.Defender.HasActiveItem(427) && setup.Move.Element == Enums.PokemonType.Water
                            || setup.Defender.HasActiveItem(428) && setup.Move.Element == Enums.PokemonType.Ghost
                            || setup.Defender.HasActiveItem(429) && setup.Move.Element == Enums.PokemonType.Poison
                            || setup.Defender.HasActiveItem(430) && setup.Move.Element == Enums.PokemonType.Electric
                            || setup.Defender.HasActiveItem(841) && setup.Move.Element == Enums.PokemonType.Fairy) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Its power rebounded!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP);
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }

                        //counter/mirror coat
                        if (setup.Move.MoveCategory == Enums.MoveCategory.Physical && setup.Defender.VolatileStatus.GetStatus("Counter") != null
                            || setup.Move.MoveCategory == Enums.MoveCategory.Special && setup.Defender.VolatileStatus.GetStatus("MirrorCoat") != null) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Its power rebounded!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP) * 2;
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }

                        //metal burst
                        if (setup.Move.MoveCategory != Enums.MoveCategory.Status && setup.Defender.VolatileStatus.GetStatus("MetalBurst") != null) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Its power rebounded to everyone!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int dmg = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP) * 3 / 2;
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSoundPacket("magic392.wav"), setup.Defender.X, setup.Defender.Y, 10);
                            for (int i = setup.Defender.X - 4; i <= setup.Defender.X + 4; i++) {
                                for (int j = setup.Defender.Y - 4; j <= setup.Defender.Y + 4; j++) {
                                    if (i < 0 || j < 0 || i > setup.DefenderMap.MaxX || j > setup.DefenderMap.MaxY) {

                                    } else {
                                        setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSpellAnim(319, i, j));
                                    }
                                }
                            }
                            TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 4, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, true, false, false);

                            for (int i = 0; i < targets.Foes.Count; i++) {
                                if (dmg >= targets.Foes[i].HP) {
                                    DamageCharacter(targets.Foes[i], MapManager.RetrieveActiveMap(targets.Foes[i].MapID), dmg, Enums.KillType.Other, setup.PacketStack, true);
                                    setup.Cancel = true;
                                } else {
                                    DamageCharacter(targets.Foes[i], MapManager.RetrieveActiveMap(targets.Foes[i].MapID), dmg, Enums.KillType.Other, setup.PacketStack, true);
                                }
                            }
                        }

                        //destiny bond
                        if (setup.Defender.VolatileStatus.GetStatus("DestinyBond") != null) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " is trying to take its foe with it!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP);
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }

                        //rebound
                        if (setup.Defender.VolatileStatus.GetStatus("Rebound") != null) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Its power rebounded!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP) / 2;
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }

                        //mini counter item
                        if (HasActiveBagItem(setup.Defender, 8, 0, 0)) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Its power rebounded!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP) / 4;
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }

                        //full counter item
                        if (HasActiveBagItem(setup.Defender, 23, 0, 0)) {
                         if (Server.Math.Rand(0, 4) == 0) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Its power rebounded!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            int recoil = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP);
                            if (recoil < 0) recoil = 0;
                            if (recoil >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, recoil, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                        }

                        //random PP restoration when hurt
                        if (HasActiveBagItem(setup.Defender, 17, 0, 0) && Server.Math.Rand(0, 9) <= 0) {
                            int i = Server.Math.Rand(1, 3);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " randomly restored PP!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            HealCharacterPP(setup.Defender, setup.DefenderMap, i, setup.PacketStack);
                        }

                        //grudge
                        status = setup.Attacker.VolatileStatus.GetStatus("LastUsedMoveSlot");
                        if (setup.KnockedOut && setup.Defender.HP <= 0 && setup.Defender.VolatileStatus.GetStatus("Grudge") != null && status != null) {

                            setup.Attacker.Moves[status.Counter].CurrentPP = 0;
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                PacketBuilder.AppendPlayerMoves(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            }
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("The grudge took effect!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                        }

                        if (setup.KnockedOut && setup.Defender.HP <= 0
                         && HasAbility(setup.Attacker, "Moxie") && Server.Math.Rand(0, 3) == 0) {
                            ChangeAttackBuff(setup.Attacker, setup.AttackerMap, 1, setup.PacketStack);
                        }
                    }

                    if (setup.Defender.StatusAilment == Enums.StatusAilment.Freeze && setup.Move.Element == Enums.PokemonType.Fire) {
                        SetStatusAilment(setup.Defender, setup.DefenderMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                    }

                    //Bide
                    status = setup.Defender.VolatileStatus.GetStatus("Bide");
                    if (status != null) {
                        status.Counter += setup.Damage;
                        setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " is storing energy!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    }

                    if (setup.Defender.VolatileStatus.GetStatus("Avalanche") != null) {
                       	BattleSetup counterSetup = new BattleSetup();
                       	if (setup.Damage > 0) {
                       		counterSetup.BattleTags.Add("Avalanche");
                       	}

                       	counterSetup.Attacker = setup.Defender;
                        counterSetup.moveSlot = -1;

                        BattleProcessor.HandleAttack(counterSetup);

                        BattleProcessor.FinalizeAction(counterSetup, setup.PacketStack);
                    }

                    if (setup.Defender.VolatileStatus.GetStatus("VitalThrow") != null) {
                       	BattleSetup counterSetup = new BattleSetup();
                       	counterSetup.BattleTags.Add("VitalThrow");

                       	counterSetup.Attacker = setup.Defender;
                        counterSetup.moveSlot = -1;

                        BattleProcessor.HandleAttack(counterSetup);

                        BattleProcessor.FinalizeAction(counterSetup, setup.PacketStack);
                    }

                    //Focus Punch
                    if (setup.Damage > 0 && setup.Defender.VolatileStatus.GetStatus("FocusPunch") != null) {
                        RemoveExtraStatus(setup.Defender, setup.DefenderMap, "FocusPunch", setup.PacketStack);
                        if (setup.Attacker.PauseTimer.Tick < Core.GetTickCount().Tick) {
                            setup.Attacker.PauseTimer = new TickCount(Core.GetTickCount().Tick);
                        }
                        setup.Attacker.PauseTimer = new TickCount(setup.Attacker.PauseTimer.Tick + 1500);
                    }

                    //joy ribbon
                    if (GetBattleTagArg(setup.BattleTags, "PrevHP", 1) != null) {
                        if (HasActiveBagItem(setup.Defender, 19, 0, 0) || setup.Defender.HasActiveItem(139) && setup.Defender.CharacterType == Enums.CharacterType.Recruit && (!setup.KnockedOut || setup.Defender.HP > 0) && setup.Damage > 0
                            && setup.Attacker != null && setup.Attacker.CharacterType != Enums.CharacterType.Recruit) {
                            int damageChange = (GetBattleTagArg(setup.BattleTags, "PrevHP", 1).ToInt() - setup.Defender.HP) / 2;
                            if (damageChange < 0) damageChange = 0;

                            ((Recruit)setup.Defender).Exp += (ulong)damageChange / 2;
                            setup.PacketStack.AddPacket(((Recruit)setup.Defender).Owner, PacketBuilder.CreateBattleMsg("You gained " + damageChange + " experience.", Text.BrightCyan));
                            BattleProcessor.CheckPlayerLevelUp(setup.PacketStack, ((Recruit)setup.Defender).Owner);

                        }
                    }

                    if (setup.Attacker.HasActiveItem(174) && setup.Damage > 0) {

                        int heal = setup.Damage / 20;
                        if (heal > 0) {
                            HealCharacter(setup.Attacker, setup.AttackerMap, heal, setup.PacketStack);
                        }
                    }
                    //setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "/"+setup.Hit+"" + setup.moveSlot + "!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                    if (setup.Hit) {
                        if (setup.Damage > 0) {
                            point = 1;
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "LastHitBy", 1, setup.Attacker, "", setup.PacketStack);
                        } else {
                            point = 2;
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "LastHitBy", 0, setup.Attacker, "", setup.PacketStack);
                        }
                        point = 3;
                        if (setup.moveSlot >= 0) {
                            //setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " Hit by " + setup.moveIndex + "!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            AddExtraStatus(setup.Defender, setup.DefenderMap, "LastMoveHitBy", setup.moveIndex, null, "", setup.PacketStack);
                            if (setup.Attacker != setup.Defender) {
                                point = 4;
                                AddExtraStatus(setup.Defender, setup.DefenderMap, "LastMoveHitByOther", setup.moveIndex, null, "", setup.PacketStack);
                            }
                        }
                    }

                    if (setup.Hit && setup.Damage > 0) {
                        if (setup.Defender.VolatileStatus.GetStatus("Illusion") != null) {
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Illusion", setup.PacketStack);
                        }
                        if (setup.Defender.HasActiveItem(82)) {
                            setup.Defender.TakeHeldItem(1);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s balloon popped!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSpellAnim(503, setup.Defender.X, setup.Defender.Y));
                        }

                        if (setup.Defender.HasActiveItem(711) || setup.Defender.HasActiveItem(715) ||
                            setup.Defender.HasActiveItem(716) || setup.Defender.HasActiveItem(717)) {
                            setup.Defender.TakeHeldItem(1);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSpellAnim(540, setup.Defender.X, setup.Defender.Y));
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSoundPacket("Magic6.wav"), setup.Defender.X, setup.Defender.Y, 50);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("Oh no!  " + setup.Defender.Name + "'s artifact shattered!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 50);
                        }
                    }

                    if (setup.Hit && (setup.Defender.HP > 0 || !setup.KnockedOut) &&
                        (setup.Defender.HasActiveItem(807) && setup.Move.Element == Enums.PokemonType.Water ||
                        setup.Defender.HasActiveItem(808) && setup.Move.Element == Enums.PokemonType.Electric)) {
                        setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s item absorbed the attack!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                        ChangeAttackBuff(setup.Defender, null, setup.DefenderMap, 1, setup.PacketStack);
                        ChangeDefenseBuff(setup.Defender, null, setup.DefenderMap, 1, setup.PacketStack);
                        ChangeSpAtkBuff(setup.Defender, null, setup.DefenderMap, 1, setup.PacketStack);
                        ChangeSpDefBuff(setup.Defender, null, setup.DefenderMap, 1, setup.PacketStack);
                        ChangeSpeedBuff(setup.Defender, null, setup.DefenderMap, 1, setup.PacketStack);
                        ChangeAccuracyBuff(setup.Defender, null, setup.DefenderMap, 1, setup.PacketStack);
                        ChangeEvasionBuff(setup.Defender, null, setup.DefenderMap, 1, setup.PacketStack);
                        setup.Defender.TakeHeldItem(1);
                    }

                    if (setup.Defender.HasActiveItem(120)) {
                        if (setup.Defender.HeldItem.Tag.ToInt() <= 0) {
                            setup.Defender.TakeHeldItem(1);
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Pokédoll turned into a pile of fluff...", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                        setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSpellAnim(503, setup.Defender.X, setup.Defender.Y));
                        }
                    }

                } else {

                }

                if (setup.Defender != null) {

                    //effects of moves that wear off after a certain amount of hits
                    if (GetBattleTagArg(setup.BattleTags, "Snatch", 0) == null) {

                        if (setup.Attacker != setup.Defender) {
                            //statuses that kick in when the attacker is not the defender

                            status = setup.Defender.VolatileStatus.GetStatus("Wish");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Wish", setup.PacketStack);
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s wish came true!", Text.BrightGreen), setup.Defender.X, setup.Defender.Y, 10);
                                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSoundPacket("magic11.wav"));
                                    HealCharacter(setup.Defender, setup.DefenderMap, setup.Defender.MaxHP / 2, setup.PacketStack);
                                }
                            }
                            status = setup.Defender.VolatileStatus.GetStatus("WideGuard");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "WideGuard", setup.PacketStack);
                                }
                            }
                            status = setup.Defender.VolatileStatus.GetStatus("QuickGuard");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "QuickGuard", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("Protect");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Protect", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("Endure");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Endure", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("Counter");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Counter", setup.PacketStack);
                                }
                            }
                            status = setup.Defender.VolatileStatus.GetStatus("MirrorCoat");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "MirrorCoat", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("MetalBurst");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "MetalBurst", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("DestinyBond");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "DestinyBond", setup.PacketStack);
                                }
                            }

                            //rebound
                            status = setup.Defender.VolatileStatus.GetStatus("Rebound");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Rebound", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("Rage");
                            if (status != null) {
                                if (setup.Hit && setup.Move.MoveCategory != Enums.MoveCategory.Status) {
                                    ChangeAttackBuff(setup.Defender, setup.DefenderMap, 1, setup.PacketStack);
                                }
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Rage", setup.PacketStack);
                                }
                            }

                            //conversion 2
                            status = setup.Defender.VolatileStatus.GetStatus("Conversion2");
                            if (status != null) {
                                List<Enums.PokemonType> elements = new List<Enums.PokemonType>();
                                Enums.PokemonType element = Enums.PokemonType.None;
                                for (int i = 0; i < 19; i++) {
                                    int effectiveness = DamageCalculator.CalculateTypeMatchup(setup.Move.Element, (Enums.PokemonType)i);
                                    if (effectiveness == 0) {
                                        element = (Enums.PokemonType)i;
                                        break;
                                    } else if (effectiveness < 3) {
                                        elements.Add((Enums.PokemonType)i);
                                    }
                                }
                                //Messenger.AdminMsg(element.ToString(), Text.WhiteSmoke);
                                if (element == Enums.PokemonType.None && elements.Count > 0) {
                                    element = elements[Server.Math.Rand(0, elements.Count)];
                                }

                                if (element != Enums.PokemonType.None) {
                                    if (setup.Defender.Type1 != element) {
                                        AddExtraStatus(setup.Defender, setup.DefenderMap, "Type1", (int)element, null, "", setup.PacketStack);
                                    }
                                    if (setup.Defender.Type2 != Enums.PokemonType.None) {
                                        AddExtraStatus(setup.Defender, setup.DefenderMap, "Type2", 0, null, "", setup.PacketStack, false);
                                    }
                                }
                            }
                        }
                        if (MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                        //statuses that kick in when the attacker is explicitly on a different side
                            status = setup.Defender.VolatileStatus.GetStatus("Safeguard");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Safeguard", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("Status Guard");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Status Guard", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("Mist");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Mist", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("LuckyChant");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "LuckyChant", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("Reflect");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Reflect", setup.PacketStack);
                                }
                            }

                            status = setup.Defender.VolatileStatus.GetStatus("LightScreen");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Defender, setup.DefenderMap, "LightScreen", setup.PacketStack);
                                }
                            }
                        }

                    }

                    status = setup.Defender.VolatileStatus.GetStatus("Substitute");
                    if (status != null && status.Counter <= 0) {
                        RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Substitute", setup.PacketStack);
                    }

                }

                if (setup.Hit && setup.Defender != null) {
                    int attackerSpeed = setup.Attacker.Spd;
                    int defenderSpeed = setup.Defender.Spd;

                    if (setup.Defender.AttackTimer == null || setup.Defender.AttackTimer.Tick < Core.GetTickCount().Tick) {
                        setup.Defender.AttackTimer = new TickCount(Core.GetTickCount().Tick);
                    }
                    //if (!HasAbility(setup.Defender, "Unaware")) {
                    attackerSpeed = DamageCalculator.ApplySpeedBuff(attackerSpeed, setup.Attacker.SpeedBuff);
                    //}
                    //if (!HasAbility(setup.Attacker, "Unaware")) {
                    defenderSpeed = DamageCalculator.ApplySpeedBuff(defenderSpeed, setup.Defender.SpeedBuff);
                    //}

                    if (setup.Attacker.HasActiveItem(258)) {
                        attackerSpeed *= 3;
                        attackerSpeed /= 2;
                    }
                    if (setup.Defender.HasActiveItem(258)) {
                        defenderSpeed *= 3;
                        defenderSpeed /= 2;
                    }

                    if (attackerSpeed < 1) attackerSpeed = 1;
                    if (defenderSpeed < 1) defenderSpeed = 1;

                    if (setup.AttackerMap.TempStatus.GetStatus("TrickRoom") != null) {
                        int temp = attackerSpeed;
                        attackerSpeed = defenderSpeed;
                        defenderSpeed = temp;

                    }
                    if (defenderSpeed < attackerSpeed) {
                        setup.Defender.AttackTimer = new TickCount(setup.Defender.AttackTimer.Tick + 200 * defenderSpeed / attackerSpeed);
                    }
                }

                if (setup.Hit && setup.Defender != null) {
                    if (setup.Damage > 0 && setup.Defender.HasActiveItem(480)) {//eject button
                        if (setup.DefenderMap.MapType == Enums.MapType.RDungeonMap) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSoundPacket("magic256.wav"), setup.Defender.X, setup.Defender.Y, 10);
                            RandomWarp(setup.Defender, setup.DefenderMap, false, setup.PacketStack);
                        }
                    }
                    if (setup.Damage > 0 &&
                        MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)
                        && setup.Defender.HasActiveItem(240)) {//red card
                        BlowBack(setup.Attacker, setup.AttackerMap, (Enums.Direction)(((int)setup.Attacker.Direction + 1) % 2 + (int)setup.Attacker.Direction / 2 * 2), setup.PacketStack);
                    }
                }

                if (setup.BattleTags.Contains("Critical")) setup.BattleTags.Remove("Critical");

                if (setup.Defender != null && setup.DefenderMap != null && setup.DefenderMap.MapType == Enums.MapType.Instanced && ((InstancedMap)setup.DefenderMap).MapBase == 1945) {
                    setup.Defender.AttackTimer = null;
                    // Snowball game attack timer override
                }

                RemoveBattleTag(setup.BattleTags, "PrevHP");
            } catch (Exception ex) {
                Messenger.AdminMsg("Error: AfterMoveHits", Text.Black);
                //Messenger.AdminMsg(ex.ToString(), Text.Black);
                //Messenger.AdminMsg(point.ToString(), Text.Black);
            }
        }
示例#5
0
        public static void BeforeMoveHits(BattleSetup setup)
        {
            try {

                ExtraStatus status;
                //if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                //	if (Ranks.IsAllowed(((Recruit)setup.Attacker).Owner, Enums.Rank.Moniter)) {
                //		Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "Place Hit", Text.BrightRed);
                //	}
                //}
                bool followAway = false;

                if (setup.Defender != null) {

                    status = setup.Attacker.VolatileStatus.GetStatus("Follow");
                    if (status != null) {
                        if (status.Target == null) {
                            setup.Attacker.VolatileStatus.Remove(status);
                        } else if (status.Target != setup.Defender) {
                            if (status.Target != null) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " can only attack " + status.Target.Name + "!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " can only attack one target!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                            setup.Defender = null;
                            followAway = true;
                        }
                    }
                }

                if (setup.Defender != null) {
                    int criticalRate = 625;

                    if (setup.Move.AdditionalEffectData1 == 157) {
                        if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                            status = setup.Attacker.VolatileStatus.GetStatus("ProxyAttack");
                            if (status != null) {
                                setup.AttackStat = status.Counter;
                            } else {
                                setup.AttackStat = setup.Defender.Atk;
                            }
                        } else if (setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                            status = setup.Attacker.VolatileStatus.GetStatus("ProxySpAtk");
                            if (status != null) {
                                setup.AttackStat = status.Counter;
                            } else {
                                setup.AttackStat = setup.Defender.SpclAtk;
                            }
                        }
                    }

                    //defender-based move modification
                    switch (setup.Move.AdditionalEffectData1) {
                        case 7: {//extra minimize damage
                                if (setup.Move.AdditionalEffectData3 == 1 && setup.Defender.VolatileStatus.GetStatus("Minimize") != null) {
                                    setup.Multiplier *= 2;
                                }
                            }
                            break;
                        case 29: {//custom critical rate
                                criticalRate = setup.Move.AdditionalEffectData2;
                            }
                            break;
                        case 49: {//high critical rate + status
                                criticalRate = 1250;
                            }
                            break;
                        case 60: {//high critical rate of razor wind
                                if (setup.Move.AdditionalEffectData2 == 3) {
                                    criticalRate = 1250;
                                }
                            }
                            break;
                        case 73: {//Punishment
                                if (setup.Defender.AttackBuff > 0) setup.Move.Data1 += (20 * setup.Defender.AttackBuff);
                                if (setup.Defender.DefenseBuff > 0) setup.Move.Data1 += (20 * setup.Defender.DefenseBuff);
                                if (setup.Defender.SpeedBuff > 0) setup.Move.Data1 += (20 * setup.Defender.SpeedBuff);
                                if (setup.Defender.SpAtkBuff > 0) setup.Move.Data1 += (20 * setup.Defender.SpAtkBuff);
                                if (setup.Defender.SpDefBuff > 0) setup.Move.Data1 += (20 * setup.Defender.SpDefBuff);
                                if (setup.Defender.AccuracyBuff > 0) setup.Move.Data1 += (20 * setup.Defender.AccuracyBuff);
                                if (setup.Defender.EvasionBuff > 0) setup.Move.Data1 += (20 * setup.Defender.EvasionBuff);
                            }
                            break;
                        case 74: {//Brine
                                if (setup.Defender.HP <= setup.Defender.MaxHP / 2) setup.Move.Data1 *= 2;
                            }
                            break;
                        case 77: {//wring out
                                setup.Move.Data1 = 120 * setup.Defender.HP / setup.Defender.MaxHP;
                            }
                            break;
                        case 78: {//Gyro Ball
                                int attackerSpeed = setup.Attacker.Spd;
                                int defenderSpeed = setup.Defender.Spd;

                                attackerSpeed = DamageCalculator.ApplySpeedBuff(attackerSpeed, setup.Attacker.SpeedBuff);
                                defenderSpeed = DamageCalculator.ApplySpeedBuff(defenderSpeed, setup.Defender.SpeedBuff);

                                if (setup.Attacker.HasActiveItem(258)) {
                                    attackerSpeed *= 3;
                                    attackerSpeed /= 2;
                                }
                                if (setup.Defender.HasActiveItem(258)) {
                                    defenderSpeed *= 3;
                                    defenderSpeed /= 2;
                                }

                                if (attackerSpeed < 1) attackerSpeed = 1;
                                if (defenderSpeed < 1) defenderSpeed = 1;

                                switch (setup.Move.AdditionalEffectData2) {
                                    case 1: {
                                            setup.Move.Data1 = 25 * defenderSpeed / attackerSpeed;
                                            if (setup.Move.Data1 > 150) setup.Move.Data1 = 150;
                                        }
                                        break;
                                    case 2: {
                                            int ratio = attackerSpeed / defenderSpeed;
                                            if (ratio >= 4) {
                                                setup.Move.Data1 = 150;
                                            } else if (ratio >= 3) {
                                                setup.Move.Data1 = 120;
                                            } else if (ratio >= 2) {
                                                setup.Move.Data1 = 80;
                                            } else {
                                                setup.Move.Data1 = 60;
                                            }
                                        }
                                        break;
                                }
                            }
                            break;
                        case 79: {//smellingsalt
                                if (setup.Defender.StatusAilment != Enums.StatusAilment.OK && (setup.Move.AdditionalEffectData2 == 0 || setup.Defender.StatusAilment == (Enums.StatusAilment)setup.Move.AdditionalEffectData2)) {
                                    setup.Move.Data1 *= 2;
                                }
                            }
                            break;
                        case 80: {//revenge/payback
                            status = setup.Attacker.VolatileStatus.GetStatus("LastHitBy");
                                if (status != null && status.Counter == 1) {
                                    if (status.Target == null) {
                                        setup.Attacker.VolatileStatus.Remove(status);
                                    } else if (status.Target == setup.Defender) {
                                        setup.Move.Data1 *= 2;
                                    }
                                }
                            }
                            break;
                        case 81: {//Assurance
                            status = setup.Attacker.VolatileStatus.GetStatus("LastHitBy");
                                if (status != null && status.Counter == 1) {
                                    setup.Move.Data1 *= 2;
                                }
                            }
                            break;
                        case 113: {//Uproar
                            if (MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) != Enums.CharacterMatchup.Foe) {
                                    setup.Move.EffectType = Enums.MoveType.Scripted;
                                    setup.Move.Data1 = 0;
                                }
                            }
                            break;
                        case 132: {//sucker punch
                                if (MoveProcessor.IsInFront(1, setup.Attacker.Direction, setup.Attacker.X, setup.Attacker.Y, setup.Defender.X, setup.Defender.Y)) {
                                    setup.Move.Accuracy = 0;
                                }
                            }
                            break;
                        case 135: {//pursuit
                                if (setup.Defender.Direction == setup.Attacker.Direction) {
                                    setup.Multiplier *= 2;
                                }
                            }
                            break;
                        case 142: {//weight-based
                                double weight = Server.Pokedex.Pokedex.GetPokemonForm(setup.Defender.Species, setup.Defender.Form).Weight;

                                if (HasAbility(setup.Defender, "Heavy Metal") && !HasAbility(setup.Attacker, "Mold Breaker")) weight = weight * (double)2;
                                if (HasAbility(setup.Defender, "Light Metal") && !HasAbility(setup.Attacker, "Mold Breaker")) weight = weight / (double)2;
                                if (setup.Defender.HasActiveItem(347)) weight = weight / (double)2;
                                if (setup.Defender.VolatileStatus.GetStatus("Autotomize") != null) weight = weight / (double)2;

                                if (weight > 200) {
                                    setup.Move.Data1 = 120;
                                } else if (weight > 100) {
                                    setup.Move.Data1 = 100;
                                } else if (weight > 50) {
                                    setup.Move.Data1 = 80;
                                } else if (weight > 25) {
                                    setup.Move.Data1 = 60;
                                } else if (weight > 10) {
                                    setup.Move.Data1 = 40;
                                } else {
                                    setup.Move.Data1 = 20;
                                }
                            }
                            break;
                        case 143: {//weight-based (attacker sits on defender)
                                double weight = Server.Pokedex.Pokedex.GetPokemonForm(setup.Defender.Species, setup.Defender.Form).Weight;
                                if (HasAbility(setup.Defender, "Heavy Metal") && !HasAbility(setup.Attacker, "Mold Breaker")) weight = weight * (double)2;
                                if (HasAbility(setup.Defender, "Light Metal") && !HasAbility(setup.Attacker, "Mold Breaker")) weight = weight / (double)2;
                                if (setup.Defender.HasActiveItem(347)) weight = weight / (double)2;
                                if (setup.Defender.VolatileStatus.GetStatus("Autotomize") != null) weight = weight / (double)2;

                                double userWeight = Server.Pokedex.Pokedex.GetPokemonForm(setup.Attacker.Species, setup.Attacker.Form).Weight;
                                if (HasAbility(setup.Attacker, "Heavy Metal")) userWeight = userWeight * (double)2;
                                if (HasAbility(setup.Attacker, "Light Metal")) userWeight = userWeight / (double)2;
                                if (setup.Attacker.HasActiveItem(347)) userWeight = userWeight / (double)2;
                                if (setup.Attacker.VolatileStatus.GetStatus("Autotomize") != null) userWeight = userWeight / (double)2;
                                int weightRatio = (int)(userWeight / weight);
                                if (weightRatio > 5) {
                                    setup.Move.Data1 = 120;
                                } else if (weightRatio > 4) {
                                    setup.Move.Data1 = 100;
                                } else if (weightRatio > 3) {
                                    setup.Move.Data1 = 80;
                                } else if (weightRatio > 2) {
                                    setup.Move.Data1 = 60;
                                } else {
                                    setup.Move.Data1 = 40;
                                }
                            }
                            break;
                        case 151: {//synchronoise
                                if (setup.Attacker.Type1 != Enums.PokemonType.None && (setup.Attacker.Type1 == setup.Defender.Type1 || setup.Attacker.Type1 == setup.Defender.Type2) ||
                                    setup.Attacker.Type2 != Enums.PokemonType.None && (setup.Attacker.Type2 == setup.Defender.Type1 || setup.Attacker.Type2 == setup.Defender.Type2)) {
                                } else {
                                    setup.Move.Accuracy = 0;
                                }
                            }
                            break;
                        case 160: {//round
                                if (MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Friend) {
                                    setup.Move.EffectType = Enums.MoveType.Scripted;
                                    setup.Move.Data1 = 0;
                                }
                            }
                            break;
                        case 163: {//echoed voice
                            status = setup.Defender.VolatileStatus.GetStatus("EchoedVoice");
                                if (status != null) {
                                    setup.Move.Data1 *= (1 * status.Counter + 1);
                                }

                            }
                            break;
                        case 197: {//sky drop
                                //no effect on flyers/levitators?
                            }
                            break;
                        case 199: {//Fake Out
                                if (MoveProcessor.IsInFront(2, setup.Attacker.Direction, setup.Attacker.X, setup.Attacker.Y, setup.Defender.X, setup.Defender.Y)) {
                                    setup.Move.Accuracy = 0;
                                }
                            }
                            break;
                    }

                    //absorb
                    if (setup.Attacker != setup.Defender && HasActiveBagItem(setup.Defender, 2, 0, (int)setup.Move.Element)) {
                        SetAsNeutralizedMove(setup.Move);
                    }

                    if (HasActiveBagItem(setup.Defender, 1, (int)setup.Move.Element, 0)) {
                        setup.Multiplier = 0;
                    }

                    if (HasActiveBagItem(setup.Attacker, 20, 2, 0)) {  // Exclusive-item with Miracle-Eye Effect
                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "MiracleEye", 0, null, "", setup.PacketStack);
                    }
                    if (HasActiveBagItem(setup.Attacker, 20, 9, 0) || HasActiveBagItem(setup.Attacker, 20, 6, 0)) {  // Exclusive-item with Exposed Effect
                        AddExtraStatus(setup.Defender, setup.DefenderMap, "Exposed", 0, null, "", setup.PacketStack);
                    }

                    if (setup.Defender.HasActiveItem(170) && setup.Attacker != setup.Defender && (setup.Defender.CharacterType == Enums.CharacterType.MapNpc || ((Recruit)setup.Defender).Belly > 0)) {
                        string name = setup.Defender.Name;
                        TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 2, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, true, true, false);
                        int lowestSpeed = -1;
                        ICharacter singleTarget = null;
                        for (int i = 0; i < targets.Count; i++) {
                            if (setup.Attacker != targets[i] && setup.Defender != targets[i]) {
                                bool eligible = true;
                                if (targets[i].CharacterType == Enums.CharacterType.MapNpc) {
                                    if (NpcManager.Npcs[((MapNpc)targets[i]).Num].Behavior == Enums.NpcBehavior.Scripted
                                    || NpcManager.Npcs[((MapNpc)targets[i]).Num].Behavior == Enums.NpcBehavior.Friendly) {
                                        eligible = false;
                                    }
                                } else {
                                    if (Ranks.IsAllowed(((Recruit)targets[i]).Owner, Enums.Rank.Moniter)) {
                                            eligible = false;
                                    }
                                }
                                if (eligible && (lowestSpeed == -1 || targets[i].Spd > lowestSpeed)) {
                                    singleTarget = targets[i];
                                    lowestSpeed = targets[i].Spd;
                                }
                            }
                        }
                        if (singleTarget != null) {
                            if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                ((Recruit)setup.Defender).Owner.Player.BellyStepCounter += 500;
                                ((Recruit)setup.Defender).Owner.Player.ProcessHunger(setup.PacketStack);
                            }
                            setup.Defender = singleTarget;

                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(name + "'s Pass Scarf passed the attack to " + setup.Defender.Name + "!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                        }

                    }

                    //ring target
                    if (setup.Attacker != setup.Defender && setup.Move.MoveCategory != Enums.MoveCategory.Status) {
                        TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, false, true, false);
                        int highestSpeed = 0;
                        ICharacter singleTarget = null;
                        for (int i = 0; i < targets.Count; i++) {

                            if (targets[i].HasActiveItem(372) &&
                                DamageCalculator.CalculateTypeMatchup(setup.Move.Element, targets[i].Type1) + DamageCalculator.CalculateTypeMatchup(setup.Move.Element, targets[i].Type2) > 6) {
                                    if (targets[i].Spd > highestSpeed) {
                                        singleTarget = targets[i];
                                        highestSpeed = targets[i].Spd;
                                    }

                            }
                        }

                        if (singleTarget != null) {
                            setup.Defender = singleTarget;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Ring Target attracted the attack!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);;
                        }
                    }

                    //fluffy tail
                    if (setup.Attacker != setup.Defender) {
                        TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, false, true, false);
                        int highestSpeed = 0;
                        ICharacter singleTarget = null;
                        for (int i = 0; i < targets.Count; i++) {

                            if (targets[i].HasActiveItem(90) && Server.Math.Rand(0,3) == 0) {
                                    if (targets[i].Spd > highestSpeed) {
                                        singleTarget = targets[i];
                                        highestSpeed = targets[i].Spd;
                                    }

                            }
                        }

                        if (singleTarget != null) {
                            setup.Defender = singleTarget;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " drew in the attack with a Fluffy Tail!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);;
                        }
                    }

                    //magic coat
                    status = setup.Defender.VolatileStatus.GetStatus("MagicCoat");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "MagicCoat", setup.PacketStack);
                        } else {
                            if (MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe && setup.Move.MoveCategory == Enums.MoveCategory.Status
                                && !(HasAbility(setup.Attacker, "Infiltrator") || HasActiveBagItem(setup.Attacker, 7, 0, 0))) {
                                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Magic Coat bounced the attack back!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                setup.Defender = setup.Attacker;
                            }
                        }
                    }

                    //magic bounce
                    if (HasAbility(setup.Defender, "Magic Bounce") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe && setup.Move.MoveCategory == Enums.MoveCategory.Status && !HasAbility(setup.Attacker, "Mold Breaker")) {
                        setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Magic Bounce bounced the attack back!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                        setup.Defender = setup.Attacker;
                    }

                    //snatch
                    if (setup.Move.MoveCategory == Enums.MoveCategory.Status && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) != Enums.CharacterMatchup.Foe) {
                        TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, true, false, false);
                        int highestSpeed = 0;
                        ICharacter singleTarget = null;
                        for (int i = 0; i < targets.Foes.Count; i++) {
                            if (targets.Foes[i].VolatileStatus.GetStatus("Snatch") != null) {
                                if (targets.Foes[i].Spd > highestSpeed) {
                                    singleTarget = targets.Foes[i];
                                    highestSpeed = targets.Foes[i].Spd;
                                }
                            }
                        }
                        if (singleTarget != null) {
                            setup.Defender = singleTarget;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " snatched the move away!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.BattleTags.Add("Snatch");
                        }
                    }

                    //checks against ability-based immunity
                    CheckImmunityAbility(setup);

                    status = setup.Defender.VolatileStatus.GetStatus("TypeReduce");
                    if (status != null && status.Counter == (int)setup.Move.Element) {
                        setup.Multiplier /= 4;
                    }

                    if (setup.Defender.VolatileStatus.GetStatus("SkullBash") != null) {
                        setup.Multiplier /= 2;
                    }

                    //eviolite
                    if (setup.Defender.HasActiveItem(113)) {
                        setup.Multiplier *= 2;
                        setup.Multiplier /= 3;
                    }

                    //use the correct attack/sp.attack stats
                    bool hitAcross = false;
                    if (setup.Move.AdditionalEffectData1 == 146) {
                        hitAcross = true;
                    }
                    if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                        if (hitAcross) {
                            if (setup.Defender.VolatileStatus.GetStatus("ProxySpDef") != null) {
                                setup.DefenseStat = setup.Defender.VolatileStatus.GetStatus("ProxySpDef").Counter;
                            } else {
                                setup.DefenseStat = setup.Defender.SpclDef;
                            }
                        } else {
                            if (setup.Defender.VolatileStatus.GetStatus("ProxyDefense") != null) {
                                setup.DefenseStat = setup.Defender.VolatileStatus.GetStatus("ProxyDefense").Counter;
                            } else {
                                setup.DefenseStat = setup.Defender.Def;
                            }
                        }
                    } else if (setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                        if (hitAcross) {
                            if (setup.Defender.VolatileStatus.GetStatus("ProxyDefense") != null) {
                                setup.DefenseStat = setup.Defender.VolatileStatus.GetStatus("ProxyDefense").Counter;
                            } else {
                                setup.DefenseStat = setup.Defender.Def;
                            }
                        } else {
                            if (setup.Defender.VolatileStatus.GetStatus("ProxySpDef") != null) {
                                setup.DefenseStat = setup.Defender.VolatileStatus.GetStatus("ProxySpDef").Counter;
                            } else {
                                setup.DefenseStat = setup.Defender.SpclDef;
                            }
                        }
                    }

                    //defender-based weather effects

                    switch (GetCharacterWeather(setup.Defender)) {
                        case Enums.Weather.Raining:
                        case Enums.Weather.Thunder: {
                                if (setup.moveIndex == 13 || setup.moveIndex == 675) {
                                    setup.Move.Accuracy = -1;
                                }
                            }
                            break;
                        case Enums.Weather.Snowing:
                        case Enums.Weather.Snowstorm: {
                                if (setup.moveIndex == 74) {
                                    setup.Move.Accuracy = -1;
                                }

                            }
                            break;
                        case Enums.Weather.Hail: {
                                if (setup.moveIndex == 74) {
                                    setup.Move.Accuracy = -1;
                                }
                            }
                            break;
                        case Enums.Weather.DiamondDust: {
                                if (setup.Defender != null && setup.Defender.CharacterType == Enums.CharacterType.Recruit && setup.Move.Accuracy != -1) {
                                    setup.Move.Accuracy /= 2;
                                } else if (setup.Defender != null && setup.Defender.CharacterType == Enums.CharacterType.MapNpc && setup.Move.Accuracy != -1) {
                                    setup.Move.Accuracy *= 3;
                                    setup.Move.Accuracy /= 2;
                                }
                            }
                            break;
                        case Enums.Weather.Cloudy: {
                            }
                            break;
                        case Enums.Weather.Fog: {
                            }
                            break;
                        case Enums.Weather.Sunny: {
                                if (setup.moveIndex == 74) {
                                    setup.Move.Accuracy /= 2;
                                }
                                if (setup.moveIndex == 13) {
                                    setup.Move.Accuracy /= 2;
                                }
                                if (setup.moveIndex == 675) {
                                    setup.Move.Accuracy /= 2;
                                }
                            }
                            break;
                        case Enums.Weather.Sandstorm: {
                                if (setup.Move.MoveCategory == Enums.MoveCategory.Special && setup.Defender != null && (setup.Defender.Type1 == Enums.PokemonType.Rock || setup.Defender.Type2 == Enums.PokemonType.Rock)) {
                                    setup.DefenseStat *= 3;
                                    setup.DefenseStat /= 2;
                                }
                            }
                            break;
                        case Enums.Weather.Ashfall: {

                            }
                            break;

                    }

                    //zoom lens
                    if (setup.Attacker.HasActiveItem(176)) {
                        status = setup.Attacker.VolatileStatus.GetStatus("LastHitBy");
                        if (status != null && status.Counter == 1) {
                            if (status.Target == null) {
                                setup.Attacker.VolatileStatus.Remove(status);
                            } else if (status.Target == setup.Defender) {
                                setup.Move.Accuracy *= 5;
                                setup.Move.Accuracy /= 4;
                            }
                        }
                    }

                    //detect band
                    if (setup.Defender.HasActiveItem(18)) {
                        setup.Move.Accuracy *= 9;
                        setup.Move.Accuracy /= 10;
                    }

                    //brightpowder
                    if (setup.Defender.HasActiveItem(16)) {
                        int dis = System.Math.Max(System.Math.Abs(setup.Defender.X - setup.Attacker.X), System.Math.Abs(setup.Defender.Y - setup.Attacker.Y));
                        if (dis > 12) dis = 12;
                        setup.Move.Accuracy *= (100-2*dis);
                        setup.Move.Accuracy /= 100;
                    }

                    //effect of gravity
                    if (setup.Move.Accuracy != -1 && setup.AttackerMap.TempStatus.GetStatus("Gravity") != null) {
                        setup.Move.Accuracy *= 2;
                    }

                    if (setup.Move.Accuracy != -1) {
                        if (HasAbility(setup.Defender, "Unaware") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                            setup.Move.Accuracy = DamageCalculator.ApplyAccuracyBuff(setup.Move.Accuracy, 0);
                        } else {
                            setup.Move.Accuracy = DamageCalculator.ApplyAccuracyBuff(setup.Move.Accuracy, setup.Attacker.AccuracyBuff);
                        }
                        if (setup.Attacker.VolatileStatus.GetStatus("MiracleEye") != null || setup.Defender.VolatileStatus.GetStatus("Exposed") != null) {
                            setup.Move.Accuracy = DamageCalculator.ApplyEvasionBuff(setup.Move.Accuracy, 0);
                        } else {
                            if (HasAbility(setup.Attacker, "Unaware") && !HasAbility(setup.Attacker, "Mold Breaker") || setup.Move.AdditionalEffectData1 == 156) {
                                setup.Move.Accuracy = DamageCalculator.ApplyEvasionBuff(setup.Move.Accuracy, 0);
                            } else {
                                setup.Move.Accuracy = DamageCalculator.ApplyEvasionBuff(setup.Move.Accuracy, setup.Defender.EvasionBuff);
                            }
                        }
                        setup.Move.Accuracy /= 65536;
                    }

                    //normal attack has 0 crit rate and 1/2 damage
                    if (setup.moveIndex == -1) {
                        setup.Multiplier /= 2;
                        criticalRate = 0;
                    }

                    //Endure
                    if (setup.Defender.HasActiveItem(289) && setup.Defender.HP == setup.Defender.MaxHP
                        || setup.Defender.HasActiveItem(290) & Server.Math.Rand(0, 4) == 0
                        || setup.Defender.HasActiveItem(272) && setup.Move.Element == Enums.PokemonType.Water
                        || setup.Defender.HasActiveItem(273) && setup.Move.Element == Enums.PokemonType.Fire
                        || setup.Defender.HasActiveItem(274) && setup.Move.Element == Enums.PokemonType.Grass
                        || setup.Defender.HasActiveItem(275) && setup.Move.Element == Enums.PokemonType.Electric
                        || setup.Defender.HasActiveItem(276) && setup.Move.Element == Enums.PokemonType.Psychic
                        || setup.Defender.HasActiveItem(277) && setup.Move.Element == Enums.PokemonType.Normal
                        || setup.Defender.HasActiveItem(278) && setup.Move.Element == Enums.PokemonType.Ground
                        || setup.Defender.HasActiveItem(279) && setup.Move.Element == Enums.PokemonType.Bug
                        || setup.Defender.HasActiveItem(280) && setup.Move.Element == Enums.PokemonType.Dark
                        || setup.Defender.HasActiveItem(281) && setup.Move.Element == Enums.PokemonType.Fighting
                        || setup.Defender.HasActiveItem(282) && setup.Move.Element == Enums.PokemonType.Flying
                        || setup.Defender.HasActiveItem(283) && setup.Move.Element == Enums.PokemonType.Ghost
                        || setup.Defender.HasActiveItem(284) && setup.Move.Element == Enums.PokemonType.Dragon
                        || setup.Defender.HasActiveItem(285) && setup.Move.Element == Enums.PokemonType.Ice
                        || setup.Defender.HasActiveItem(286) && setup.Move.Element == Enums.PokemonType.Poison
                        || setup.Defender.HasActiveItem(287) && setup.Move.Element == Enums.PokemonType.Rock
                        || setup.Defender.HasActiveItem(288) && setup.Move.Element == Enums.PokemonType.Steel
                        || setup.Defender.HasActiveItem(340)) {
                        setup.KnockedOut = false;
                    }

                    if (setup.Defender.VolatileStatus.GetStatus("Endure") != null) {
                        setup.KnockedOut = false;
                    }

                    //npc limitations
                    if (setup.Attacker.CharacterType == Enums.CharacterType.MapNpc) {
                        setup.Multiplier *= 3;
                        setup.Multiplier /= 4;
                    }

                    //OHKO
                    if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 39) {
                        setup.Move.Accuracy = 30 + setup.Attacker.Level - setup.Defender.Level;
                        if (setup.Move.Accuracy < 0) setup.Move.Accuracy = 0;
                    }

                    //perish song
                    if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 90) {
                        setup.Move.Accuracy = 30 + setup.Attacker.Level - setup.Defender.Level;
                        if (setup.Move.Accuracy < 0) setup.Move.Accuracy = 0;
                    }

                    //dream eater prereq
                    if (setup.Move.AdditionalEffectData1 == 31 && setup.Move.AdditionalEffectData3 == 1 && setup.Defender.StatusAilment != Enums.StatusAilment.Sleep) {
                        setup.Multiplier = 0;
                    }

                    if (setup.Defender.VolatileStatus.GetStatus("MagnetRise") != null && IsGroundImmune(setup.Defender, setup.DefenderMap) && setup.Defender != setup.Attacker) {
                        if (setup.Move.Element == Enums.PokemonType.Ground) {
                            setup.Move.Accuracy = 0;
                        }
                    }

                    if (setup.Defender.HasActiveItem(82) && IsGroundImmune(setup.Defender, setup.DefenderMap) && setup.Defender != setup.Attacker) {
                        if (setup.Move.Element == Enums.PokemonType.Ground) {
                            setup.Move.Accuracy = 0;
                        }
                    }

                    //scope lens
                    if (setup.Attacker.HasActiveItem(324)) {
                        criticalRate *= 2;
                    }

                    if (HasAbility(setup.Attacker, "Super Luck")) {
                        criticalRate *= 2;
                    }

                    //focus energy
                    if (setup.Attacker.VolatileStatus.GetStatus("FocusEnergy") != null) {
                        criticalRate *= setup.Attacker.VolatileStatus.GetStatus("FocusEnergy").Counter;
                    }

                    //reflect/Light Screen
                    if ((setup.Move.MoveCategory == Enums.MoveCategory.Physical || setup.Move.AdditionalEffectData1 == 146) &&
                        (setup.Defender.VolatileStatus.GetStatus("Reflect") != null || HasActiveBagItem(setup.Defender, 30, 1, 0)) &&
                        !(HasAbility(setup.Attacker, "Infiltrator") || HasActiveBagItem(setup.Attacker, 7, 0, 0))) {
                        if (setup.Move.AdditionalEffectData1 != 136) {
                            setup.Multiplier *= 3;
                            setup.Multiplier /= 4;
                        }
                    }
                    if (setup.Move.MoveCategory == Enums.MoveCategory.Special && setup.Move.AdditionalEffectData1 != 146 &&
                        (setup.Defender.VolatileStatus.GetStatus("LightScreen") != null || HasActiveBagItem(setup.Defender, 30, 2, 0)) &&
                        !(HasAbility(setup.Attacker, "Infiltrator") || HasActiveBagItem(setup.Attacker, 7, 0, 0))) {
                        if (setup.Move.AdditionalEffectData1 != 136) {
                            setup.Multiplier *= 3;
                            setup.Multiplier /= 4;
                        }
                    }

                    if (HasActiveBagItem(setup.Defender, 18, 0, 0)) { //Exclsuive-item
                        criticalRate = 0;
                    }

                    if (setup.Defender.VolatileStatus.GetStatus("LuckyChant") != null) {
                        criticalRate = 0;
                    }

                    if (HasAbility(setup.Defender, "Battle Armor") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                        criticalRate = 0;
                    }
                    if (HasAbility(setup.Defender, "Shell Armor") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                        criticalRate = 0;
                    }

                    if (HasAbility(setup.Defender, "No Guard") || HasAbility(setup.Attacker, "No Guard")) {
                        setup.Move.Accuracy = -1;
                    }

                    if (setup.Defender.VolatileStatus.GetStatus("Telekinesis") != null && setup.Defender != setup.Attacker) {
                        if (setup.Move.Element == Enums.PokemonType.Ground && IsGroundImmune(setup.Defender, setup.DefenderMap)) {
                            setup.Move.Accuracy = 0;
                        } else {
                            setup.Move.Accuracy = -1;
                        }
                    }

                    //Wonder Skin
                    if (HasAbility(setup.Defender, "Wonder Skin") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe && setup.Move.MoveCategory == Enums.MoveCategory.Status && !HasAbility(setup.Attacker, "Mold Breaker")) {
                        if (Server.Math.Rand(0, 2) == 0) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Wonder Skin warded off the move!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Move.Accuracy = 0;
                        }
                    }

                    //Wide Guard
                    if (setup.Attacker != setup.Defender && (setup.Move.RangeType == Enums.MoveRange.Floor || setup.Move.RangeType == Enums.MoveRange.Room || setup.Move.RangeType == Enums.MoveRange.FrontAndSides)
                        && setup.Defender.VolatileStatus.GetStatus("WideGuard") != null) {
                        if (setup.Move.AdditionalEffectData1 == 128) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " broke through the protection!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "WideGuard", setup.PacketStack, false);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " is protected by Wide Guard!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Move.Accuracy = 0;
                        }
                    }

                    //Quick Guard
                    if (setup.Attacker != setup.Defender && (setup.Move.RangeType == Enums.MoveRange.Floor || setup.Move.Range > 2)
                        && setup.Defender.VolatileStatus.GetStatus("QuickGuard") != null) {
                        if (setup.Move.AdditionalEffectData1 == 128) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " broke through the protection!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "QuickGuard", setup.PacketStack, false);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " is protected by Quick Guard!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Move.Accuracy = 0;
                        }
                    }

                    //protect
                    if (setup.Attacker != setup.Defender && setup.Defender.VolatileStatus.GetStatus("Protect") != null) {
                        if (setup.Move.AdditionalEffectData1 == 128) {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " broke through the protection!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            RemoveExtraStatus(setup.Defender, setup.DefenderMap, "Protect", setup.PacketStack, false);
                        } else if (setup.Move.AdditionalEffectData1 == 60 && setup.Move.AdditionalEffectData2 == 9) {

                        } else {
                            setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " protected itself!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Move.Accuracy = 0;
                        }
                    }

                    //semi-invulnerable
                    if (setup.Attacker != setup.Defender) {
                        status = setup.Defender.VolatileStatus.GetStatus("SemiInvul");
                        if (status != null) {
                            if (status.Tag == "Bounce") {
                                if (setup.moveIndex == 88 || setup.moveIndex == 113) {//gust and twister
                                    setup.Multiplier *= 3;
                                    setup.Multiplier /= 2;
                                } else if (setup.moveIndex == 13 || setup.moveIndex == 334 ||
                                    setup.moveIndex == 675 || setup.moveIndex == 612) {//thunder/sky upper/hurricane/smack down

                                } else {
                                    setup.Move.Accuracy = 0;
                                }
                            } else if (status.Tag == "Fly") {
                                if (setup.moveIndex == 88 || setup.moveIndex == 113) {//gust and twister
                                    setup.Multiplier *= 3;
                                    setup.Multiplier /= 2;
                                } else if (setup.moveIndex == 13 || setup.moveIndex == 334 ||
                                    setup.moveIndex == 675 || setup.moveIndex == 612 || setup.moveIndex == 179) {//thunder/sky upper/hurricane/smack down

                                } else {
                                    setup.Move.Accuracy = 0;
                                }
                            } else if (status.Tag == "Dig") {
                                if (setup.moveIndex == 15 || setup.moveIndex == 45 || setup.moveIndex == 151) {
                                    setup.Multiplier *= 3;
                                    setup.Multiplier /= 2;
                                } else {
                                    setup.Move.Accuracy = 0;
                                }
                            } else if (status.Tag == "Dive") {
                                if (setup.moveIndex == 462 || setup.moveIndex == 203) {
                                    setup.Multiplier *= 3;
                                    setup.Multiplier /= 2;
                                } else {
                                    setup.Move.Accuracy = 0;
                                }
                            } else if (status.Tag == "PhantomForce" || status.Tag == "ShadowForce") {
                                setup.Move.Accuracy = 0;
                            }
                        }

                        status = setup.Defender.VolatileStatus.GetStatus("SkyDrop:0");
                        if (status != null) {
                            if (setup.moveIndex == 88 || setup.moveIndex == 113 ||
                               	setup.moveIndex == 13 || setup.moveIndex == 334 ||
                              	setup.moveIndex == 675 || setup.moveIndex == 612 || setup.moveIndex == 179) {//thunder/sky upper/hurricane/smack down
                            } else {
                                setup.Move.Accuracy = 0;
                            }
                        }
                        status = setup.Defender.VolatileStatus.GetStatus("SkyDrop:1");
                        if (status != null) {
                            if (setup.moveIndex == 88 || setup.moveIndex == 113 ||
                               	setup.moveIndex == 13 || setup.moveIndex == 334 ||
                              	setup.moveIndex == 675 || setup.moveIndex == 612 || setup.moveIndex == 179) {//thunder/sky upper/hurricane/smack down
                            } else {
                                setup.Move.Accuracy = 0;
                            }
                        }
                    }

                    //checks against ability-based avoidance
                    CheckDefenderModAbility(setup);

                    //AoE drawbacks
                    if (!(BattleProcessor.HitsSelf(setup.Move.TargetType) || BattleProcessor.HitsAllies(setup.Move.TargetType)) || setup.Move.Accuracy != -1) {
                        if (setup.Move.RangeType == Enums.MoveRange.Room || setup.Move.RangeType == Enums.MoveRange.Floor) {
                            if (setup.Move.Range > 1) {
                                if (setup.Move.Range > 2) {
                                    if (setup.Move.Accuracy == -1 || setup.Move.Accuracy > 100) {
                                        setup.Move.Accuracy = 100;
                                    }
                                    setup.Move.Accuracy *= 3;
                                    setup.Move.Accuracy /= 4;
                                }
                                setup.Multiplier *= 3;
                                setup.Multiplier /= 4;
                            }
                        } else if (setup.Move.RangeType == Enums.MoveRange.FrontAndSides && setup.Move.Range > 2) {
                            if (setup.Move.Accuracy == -1 || setup.Move.Accuracy > 100) {
                                setup.Move.Accuracy = 100;
                            }
                            setup.Multiplier *= 4;
                            setup.Multiplier /= 5;
                            setup.Move.Accuracy *= 4;
                            setup.Move.Accuracy /= 5;
                        }
                    }

                    //haze and pain split hit no matter what
                    if (setup.Move.EffectType == Enums.MoveType.Scripted &&
                        (setup.Move.Data1 == 103 || setup.Move.AdditionalEffectData1 == 103 || setup.Move.Data1 == 204 || setup.Move.Data1 == 209)) {
                        setup.Move.Accuracy = -1;
                    }

                    //safe zone attack-all protection
                    if (SafeZoneCheck(setup.Attacker, setup.AttackerMap, setup.Defender, setup.DefenderMap)) {
                        if (BattleProcessor.HitsAllies(setup.Move.TargetType) && setup.Move.MoveCategory != Enums.MoveCategory.Status
                            || setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 90) {

                            setup.Move.Accuracy = 0;

                            // Used in the snowball game - this is the snowball move
                            if (setup.moveIndex == 526) {
                                setup.Move.Accuracy = 100;
                            }
                        }
                    }

                    //see if it hits
                    if (setup.Move.Accuracy == -1 || Server.Math.Rand(0, 100) < setup.Move.Accuracy) {
                        setup.Hit = true;
                        if (!setup.BattleTags.Contains("HitSomething")) setup.BattleTags.Add("HitSomething");

                        if (setup.Move.EffectType == Enums.MoveType.SubHP && setup.Defender != null && criticalRate > 0 && Server.Math.Rand(0, 10000) < criticalRate) {//see if it criticals
                            //setup.Critical = true;
                            if (HasAbility(setup.Attacker, "Sniper")) {
                                setup.Multiplier *= 5;
                            } else {
                                setup.Multiplier *= 3;
                            }
                            setup.Multiplier /= 2;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("A critical hit!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            setup.BattleTags.Add("Critical");

                        } else {
                            int stockpileBonus = 0;
                            status = setup.Defender.VolatileStatus.GetStatus("Stockpile");
                            if (status != null) {
                                stockpileBonus = status.Counter;
                            }
                            if (setup.Move.MoveCategory == Enums.MoveCategory.Physical && setup.Defender != null) {
                                if (setup.Move.AdditionalEffectData1 == 157) {
                                    setup.AttackStat = DamageCalculator.ApplyAttackBuff(setup.AttackStat, setup.Defender.AttackBuff) / 256;
                                }
                                if ((!HasAbility(setup.Attacker, "Unaware") || HasAbility(setup.Defender, "Mold Breaker")) && setup.Move.AdditionalEffectData1 != 156) {

                                    setup.DefenseStat = DamageCalculator.ApplyDefenseBuff(setup.DefenseStat, setup.Defender.DefenseBuff + stockpileBonus) / 256;
                                }
                            } else if (setup.Move.MoveCategory == Enums.MoveCategory.Special && setup.Defender != null) {
                                if (setup.Move.AdditionalEffectData1 == 157) {
                                    setup.AttackStat = DamageCalculator.ApplyAttackBuff(setup.AttackStat, setup.Defender.SpAtkBuff) / 256;
                                }
                                if (!HasAbility(setup.Attacker, "Unaware") || HasAbility(setup.Defender, "Mold Breaker")) {
                                    if (setup.Move.AdditionalEffectData1 == 146) {
                                        setup.DefenseStat = DamageCalculator.ApplyDefenseBuff(setup.DefenseStat, setup.Defender.DefenseBuff + stockpileBonus) / 256;
                                    } else if (setup.Move.AdditionalEffectData1 != 156){
                                        setup.DefenseStat = DamageCalculator.ApplyDefenseBuff(setup.DefenseStat, setup.Defender.SpDefBuff + stockpileBonus) / 256;
                                    }
                                }
                            }
                        }

                        if (setup.Defender != null && setup.Move.EffectType == Enums.MoveType.SubHP) {
                            int effectiveness = DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type1) + DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type2);

                            if (setup.Move.Element == Enums.PokemonType.Psychic && setup.Attacker.VolatileStatus.GetStatus("MiracleEye") != null) {
                                if (setup.Defender.Type1 == Enums.PokemonType.Dark) {
                                    effectiveness += 3;
                                }
                                if (setup.Defender.Type2 == Enums.PokemonType.Dark) {
                                    effectiveness += 3;
                                }
                            }
                            if (setup.Move.AdditionalEffectData1 == 226) {
                                if (setup.Defender.Type1 == Enums.PokemonType.Water) {
                                    effectiveness += 2;
                                }
                                if (setup.Defender.Type2 == Enums.PokemonType.Water) {
                                    effectiveness += 2;
                                }
                            }

                            if (setup.Move.Element == Enums.PokemonType.Ground && !IsGroundImmune(setup.Defender, setup.DefenderMap)) {
                                if (setup.Defender.Type1 == Enums.PokemonType.Flying) {
                                    effectiveness += 3;
                                }
                                if (setup.Defender.Type2 == Enums.PokemonType.Flying) {
                                    effectiveness += 3;
                                }
                            }

                            if ((setup.Move.Element == Enums.PokemonType.Normal || setup.Move.Element == Enums.PokemonType.Fighting) && (HasAbility(setup.Attacker, "Scrappy") || setup.Defender.VolatileStatus.GetStatus("Exposed") != null)) {
                                if (setup.Defender.Type1 == Enums.PokemonType.Ghost) {
                                    effectiveness += 3;
                                }
                                if (setup.Defender.Type2 == Enums.PokemonType.Ghost) {
                                    effectiveness += 3;
                                }
                            }

                            if (effectiveness < 6 && setup.Defender.HasActiveItem(372)) {
                                effectiveness = 6;
                            }

                            if (effectiveness != 6) {
                                setup.Multiplier *= DamageCalculator.Effectiveness[effectiveness];
                                setup.Multiplier /= 256;

                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(BattleProcessor.EffectivenessToPhrase(effectiveness), Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                            }

                            //Expert Belt
                            if (setup.Attacker.HasActiveItem(38) && effectiveness > 6) {
                                setup.Multiplier *= 11;
                                setup.Multiplier /= 10;
                            }

                            if (setup.Defender.HasActiveItem(120)) {
                                TargetCollection frontTargets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.FrontAndSides, 50, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, setup.Defender.Direction, true, true, false);
                                bool front = false;
                                for (int i = 0; i < frontTargets.Count; i++) {
                                    if (frontTargets[i] == setup.Attacker) {
                                        front = true;
                                        break;
                                    }
                                }
                                if (true) {
                                    int damage = DamageCalculator.CalculateDamage(setup.Move.Data1, setup.AttackStat, setup.Attacker.Level, setup.DefenseStat) * setup.Multiplier / 1000;
                                    setup.Defender.HeldItem.Tag = (setup.Defender.HeldItem.Tag.ToInt() - damage).ToString();
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The Pokédoll took the attack instead!", Text.BrightGreen), setup.Defender.X, setup.Defender.Y, 10);
                                    setup.Multiplier = -1;
                                }
                                //take held item
                            }

                            //substitute
                            status = setup.Defender.VolatileStatus.GetStatus("Substitute");
                            if (status != null) {
                                int damage = DamageCalculator.CalculateDamage(setup.Move.Data1, setup.AttackStat, setup.Attacker.Level, setup.DefenseStat) * setup.Multiplier / 1000;
                                status.Counter -= damage;
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s substitute took " + damage + " damage!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                setup.Multiplier = -1;
                            }
                        }
                    } else {
                        setup.Hit = false;
                        //setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("The move missed " + setup.Defender.Name + "!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    }
                    setup.BattleTags.Add("PrevHP:" + setup.Defender.HP);
                } else {
                    if (followAway) {
                        setup.Hit = false;
                    } else {
                        setup.Hit = true;
                    }
                }
            } catch (Exception ex) {
                Messenger.AdminMsg("Error: BeforeMoveHits", Text.Black);
            }
        }
示例#6
0
        public static void CheckImmunityAbility(BattleSetup setup)
        {
            if (HasAbility(setup.Defender, "Dry Skin") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Water) {
                    SetAsNeutralizedMove(setup.Move);
                }
            }
            if (HasAbility(setup.Defender, "Flash Fire") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Fire) {
                    SetAsNeutralizedMove(setup.Move);
                }
            }

            //Lightningrod
            if (!HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Electric && setup.Attacker != setup.Defender) {
                    TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, false, true, true);
                    int highestSpeed = 0;
                    ICharacter singleTarget = null;
                    for (int i = 0; i < targets.Count; i++) {
                        if (HasAbility(targets[i], "Lightning Rod")) {
                            if (targets[i].Spd > highestSpeed) {
                                singleTarget = targets[i];
                                highestSpeed = targets[i].Spd;
                            }
                        }
                    }

                    if (singleTarget != null) {
                        setup.Defender = singleTarget;
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Lightning Rod drew in the attack!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                        SetAsNeutralizedMove(setup.Move);
                    }
                }
            }

            if (HasAbility(setup.Defender, "Motor Drive") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Electric) {
                    SetAsNeutralizedMove(setup.Move);
                }
            }
            if (HasAbility(setup.Defender, "Pressure") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (setup.moveSlot > -1 && setup.moveSlot < 4 && setup.Attacker.Moves[setup.moveSlot].CurrentPP > 0) {
                    setup.Attacker.Moves[setup.moveSlot].CurrentPP--;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " is exerting its Pressure!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                        PacketBuilder.AppendMovePPUpdate(((Recruit)setup.Attacker).Owner, setup.PacketStack, setup.moveSlot);
                    }
                }
            }
            if (HasAbility(setup.Defender, "Sap Sipper") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Grass) {
                    SetAsNeutralizedMove(setup.Move);
                }
            }

            if (HasAbility(setup.Defender, "Shield Dust") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                switch (setup.Move.AdditionalEffectData1) {
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 21:
                    case 22:
                    case 23:
                    case 24:
                    case 25:
                    case 26:
                    case 27:
                    case 35:
                    case 37:
                    case 38:
                    case 48:
                    case 49:
                    case 50:
                    case 51: {
                            setup.Move.AdditionalEffectData2 = 0;
                        }
                        break;
                }
            }

            //Storm Drain
            if (!HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Water && setup.Attacker != setup.Defender) {
                    TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, false, true, true);
                    int highestSpeed = 0;
                    ICharacter singleTarget = null;
                    for (int i = 0; i < targets.Count; i++) {

                        if (HasAbility(targets[i], "Storm Drain")) {
                            if (targets[i].Spd > highestSpeed) {
                                singleTarget = targets[i];
                                highestSpeed = targets[i].Spd;
                            }
                        }
                    }

                    if (singleTarget != null) {
                        setup.Defender = singleTarget;
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Storm Drain drew in the attack!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                        SetAsNeutralizedMove(setup.Move);
                    }
                }
            }

            if (HasAbility(setup.Defender, "Telepathy") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Friend && setup.Move.EffectType == Enums.MoveType.SubHP) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " avoided it's ally's attack with Telepathy!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.Move.Accuracy = 0;
                }
            }
            if (HasAbility(setup.Defender, "Volt Absorb") && setup.Defender != setup.Attacker && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Electric) {
                    SetAsNeutralizedMove(setup.Move);
                }
            }
            if (HasAbility(setup.Defender, "Water Absorb") && setup.Defender != setup.Attacker && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Water) {
                    SetAsNeutralizedMove(setup.Move);
                }
            }
            if (HasAbility(setup.Defender, "Wonder Guard") && setup.Defender != setup.Attacker && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.None) {
                    setup.Move.EffectType = Enums.MoveType.Scripted;
                    setup.Move.Data1 = 30;
                    setup.Move.Data2 = 1;
                    setup.Move.Data3 = 0;
                    setup.Move.AdditionalEffectData1 = 0;
                    setup.Move.AdditionalEffectData2 = 0;
                    setup.Move.AdditionalEffectData3 = 0;
                }
            }
        }
示例#7
0
 public void UseMoveOnAllies(BattleSetup setup, TargetCollection targets)
 {
     Parties.Party party = null;
     if (owner.Player.IsInParty()) {
         party = Parties.PartyManager.FindPlayerParty(owner);
     }
     //List<ICharacter> targets = MoveProcessor.GetTargetsInRange(setup.Move.RangeType, setup.Move.Range, setup.AttackerMap, this, owner.Player.X, owner.Player.Y, owner.Player.Direction);
     Move move = setup.SetdownMove();
     // Attack any players that are on the map
     foreach (ICharacter i in targets.Friends) {
         if (i.CharacterType == Enums.CharacterType.Recruit && Ranks.IsAllowed(((Recruit)i).Owner, Enums.Rank.Moniter)
                 && !((Recruit)i).Owner.Player.Hunted && !((Recruit)i).Owner.Player.Dead) {
         } else {
             setup.Defender = i;
             BattleProcessor.MoveHitCharacter(setup);
             setup.SetupMove(move);
             if (setup.Cancel) {
                 return;
             }
         }
     }
 }
示例#8
0
        public static void HandleItemUse(InventoryItem item, int invNum, BattleSetup setup)
        {
            // Prevent hacking
            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                if (invNum != -1 && (invNum < 1 || invNum > ((Recruit)setup.Attacker).Owner.Player.MaxInv)) {
                    Messenger.HackingAttempt(((Recruit)setup.Attacker).Owner, "Invalid InvNum");
                    return;
                }
            }

            if (item.Num < 0 || item.Num >= Items.ItemManager.Items.MaxItems) {
                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                    Messenger.HackingAttempt(((Recruit)setup.Attacker).Owner, "Invalid ItemNum");
                }
                return;
            }

            setup.AttackerMap.ProcessingPaused = false;

            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                if (Ranks.IsDisallowed(((Recruit)setup.Attacker).Owner, Enums.Rank.Moniter) || ((Recruit)setup.Attacker).Owner.Player.ProtectionOff) {
                    ((Recruit)setup.Attacker).Owner.Player.Hunted = true;
                    PacketBuilder.AppendHunted(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                }
            }

            if (!(bool)Scripting.ScriptManager.InvokeFunction("CanUseItem", setup, item)) {
                return;
            }

            // Find out what kind of item it is
            switch (ItemManager.Items[item.Num].Type) {
                case Enums.ItemType.PotionAddHP: {
                        setup.Attacker.HP += ItemManager.Items[item.Num].Data1;
                        if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                            ((Recruit)setup.Attacker).Belly += ItemManager.Items[item.Num].Data2;
                            if (((Recruit)setup.Attacker).Belly > ((Recruit)setup.Attacker).MaxBelly) {
                                ((Recruit)setup.Attacker).Belly = ((Recruit)setup.Attacker).MaxBelly;
                            }
                            PacketBuilder.AppendBelly(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            if (ItemManager.Items[item.Num].StackCap > 0) {
                                ((Recruit)setup.Attacker).Owner.Player.TakeItemSlot(invNum, 1, true);
                            } else {
                                ((Recruit)setup.Attacker).Owner.Player.TakeItemSlot(invNum, 0, true);
                            }
                        } else {
                            if (invNum != -1) {
                                setup.Attacker.TakeHeldItem(1);
                            }
                        }
                    }
                    break;
                case Enums.ItemType.PotionAddMP: {
                        for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                            if (setup.Attacker.Moves[i] != null) {
                                setup.Attacker.Moves[i].CurrentPP += ItemManager.Items[item.Num].Data1;
                                if (setup.Attacker.Moves[i].CurrentPP > setup.Attacker.Moves[i].MaxPP) {
                                    setup.Attacker.Moves[i].CurrentPP = setup.Attacker.Moves[i].MaxPP;
                                }

                            }
                        }
                        if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                            PacketBuilder.AppendPlayerMoves(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            ((Recruit)setup.Attacker).Belly += ItemManager.Items[item.Num].Data2;
                            if (((Recruit)setup.Attacker).Belly > ((Recruit)setup.Attacker).MaxBelly) {
                                ((Recruit)setup.Attacker).Belly = ((Recruit)setup.Attacker).MaxBelly;
                            }
                            PacketBuilder.AppendBelly(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            if (ItemManager.Items[item.Num].StackCap > 0) {
                                ((Recruit)setup.Attacker).Owner.Player.TakeItemSlot(invNum, 1, true);
                            } else {
                                ((Recruit)setup.Attacker).Owner.Player.TakeItemSlot(invNum, 0, true);
                            }
                        } else {
                            if (invNum != -1) {
                                setup.Attacker.TakeHeldItem(1);
                            }
                        }
                    }
                    break;
                case Enums.ItemType.PotionAddBelly: {
                        if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                            if (((Recruit)setup.Attacker).Belly < ((Recruit)setup.Attacker).MaxBelly) {
                                ((Recruit)setup.Attacker).MaxBelly += ItemManager.Items[item.Num].Data2;
                                ((Recruit)setup.Attacker).Belly += ItemManager.Items[item.Num].Data1;
                            } else {
                                ((Recruit)setup.Attacker).MaxBelly += ItemManager.Items[item.Num].Data3;
                                ((Recruit)setup.Attacker).Belly += ItemManager.Items[item.Num].Data1;
                            }
                            if (((Recruit)setup.Attacker).MaxBelly > 200) {
                                ((Recruit)setup.Attacker).MaxBelly = 200;
                            }
                            if (((Recruit)setup.Attacker).Belly > ((Recruit)setup.Attacker).MaxBelly) {
                                ((Recruit)setup.Attacker).Belly = ((Recruit)setup.Attacker).MaxBelly;
                            }
                            PacketBuilder.AppendBelly(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            if (ItemManager.Items[item.Num].StackCap > 0) {
                                ((Recruit)setup.Attacker).Owner.Player.TakeItemSlot(invNum, 1, true);
                            } else {
                                ((Recruit)setup.Attacker).Owner.Player.TakeItemSlot(invNum, 0, true);
                            }
                        } else {
                            if (invNum != -1) {
                                setup.Attacker.TakeHeldItem(1);
                            }
                        }
                    }
                    break;
                case Enums.ItemType.Key: {
                        if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                            int x = 0;
                            int y = 0;
                            IMap map = ((Recruit)setup.Attacker).Owner.Player.GetCurrentMap();
                            switch (((Recruit)setup.Attacker).Direction) {
                                case Enums.Direction.Up: {
                                        if (((Recruit)setup.Attacker).Y > 0) {
                                            x = ((Recruit)setup.Attacker).X;
                                            y = ((Recruit)setup.Attacker).Y - 1;
                                        } else {
                                            return;
                                        }
                                    }
                                    break;
                                case Enums.Direction.Down: {
                                        if (((Recruit)setup.Attacker).Y < map.MaxY) {
                                            x = ((Recruit)setup.Attacker).X;
                                            y = ((Recruit)setup.Attacker).Y + 1;
                                        } else {
                                            return;
                                        }
                                    }
                                    break;
                                case Enums.Direction.Left: {
                                        if (((Recruit)setup.Attacker).X > 0) {
                                            x = ((Recruit)setup.Attacker).X - 1;
                                            y = ((Recruit)setup.Attacker).Y;
                                        } else {
                                            return;
                                        }
                                    }
                                    break;
                                case Enums.Direction.Right: {
                                        if (((Recruit)setup.Attacker).X < map.MaxX) {
                                            x = ((Recruit)setup.Attacker).X + 1;
                                            y = ((Recruit)setup.Attacker).Y;
                                        } else {
                                            return;
                                        }
                                    }
                                    break;
                            }

                            // Check if a key exists
                            if (map.Tile[x, y].Type == Enums.TileType.Key) {
                                // Check if the key they are using matches the map key
                                if (item.Num == map.Tile[x, y].Data1) {
                                    map.Tile[x, y].DoorOpen = true;
                                    map.Tile[x, y].DoorTimer = Core.GetTickCount();

                                    Messenger.SendDataToMap(((Recruit)setup.Attacker).MapID, TcpPacket.CreatePacket("mapkey", x.ToString(), y.ToString(), "1"));

                                    if (map.Tile[x, y].String1.Trim() != "") {
                                        Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "A door has been unlocked!", Text.White);
                                    } else {
                                        Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, map.Tile[x, y].String1.Trim(), Text.White);
                                    }

                                    Messenger.PlaySoundToMap(((Recruit)setup.Attacker).MapID, "key.wav");

                                    // Check if we are supposed to take the item away
                                    if (map.Tile[x, y].Data2 == 1) {
                                        ((Recruit)setup.Attacker).Owner.Player.TakeItemSlot(invNum, 0, true);
                                        Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "The key dissolves.", Text.Yellow);
                                    }
                                }
                            }

                            if (map.Tile[x, y].Type == Enums.TileType.Door) {
                                map.Tile[x, y].DoorOpen = true;
                                map.Tile[x, y].DoorTimer = Core.GetTickCount();

                                Messenger.SendDataToMap(((Recruit)setup.Attacker).MapID, TcpPacket.CreatePacket("mapkey", x.ToString(), y.ToString(), "1"));
                                Messenger.PlaySoundToMap(((Recruit)setup.Attacker).MapID, "key.wav");
                            }
                        }
                    }
                    break;
                case Enums.ItemType.TM: {
                        // Get the spell num

                        if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                            int n = ItemManager.Items[item.Num].Data1;

                            if (n > 0) {
                                // Make sure they are the right class
                                if (((Recruit)setup.Attacker).CanLearnTMMove(n)) {

                                    if (((Recruit)setup.Attacker).CanLearnNewMove()) {
                                        if (((Recruit)setup.Attacker).HasMove(n) == false) {
                                            ((Recruit)setup.Attacker).LearnNewMove(n);
                                            ((Recruit)setup.Attacker).Owner.Player.TakeItemSlot(invNum, 0, true);
                                            Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "You have learned a new move!", Text.White);
                                            Messenger.SendPlayerMoves(((Recruit)setup.Attacker).Owner);
                                        } else {
                                            Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "You already know this move!", Text.BrightRed);
                                        }
                                    } else {
                                        if (((Recruit)setup.Attacker).HasMove(n) == false) {
                                            int itemNum = item.Num;
                                            ((Recruit)setup.Attacker).MoveItem = itemNum;
                                            ((Recruit)setup.Attacker).LearnNewMove(n);
                                        } else {
                                            Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "You already know this move!", Text.BrightRed);
                                        }
                                    }
                                } else {
                                    Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "You cannot learn this move!", Text.White);
                                }
                            } else {
                                Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "There is no move that can be learned. Please inform an admin.", Text.BrightRed);
                            }
                        }
                    }
                    break;
                case Enums.ItemType.Scripted: {
                        Scripting.ScriptManager.InvokeSub("ScriptedItem", setup, item, invNum);
                    }
                    break;
            }
        }
示例#9
0
        public static void MoveHitCharacter(BattleSetup setup)
        {
            setup.Multiplier = setup.AttackerMultiplier;
            setup.KnockedOut = true;
            //setup.Critical = false;
            setup.Damage = 0;
            //if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
            //    Recruit recruit = setup.Defender as Recruit;
            //    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
            //Messenger.BattleMsg(setup.Attacker.Owner, ((Recruit)setup.Attacker).Owner.Player.Name + MoveManager.Moves[moveNum].Name, Text.BrightRed);
            //    	   if (!string.IsNullOrEmpty(setup.Move.Name)) {
            //    	   	setup.DefenderPacketStack.AddPacket(PacketBuilder.CreateBattleMsg(setup.Attacker.Name + setup.Move.Name, Text.BrightRed));
            //    	   }

            //BattleProcessor.PlayerAttackPlayer(((Recruit)setup.Attacker).Owner, recruit.Owner, damage);
            //    } else if (setup.Attacker.CharacterType == Enums.CharacterType.MapNpc) {
            //    	if (!string.IsNullOrEmpty(setup.Move.Name)) {
            //    		setup.DefenderPacketStack.AddPacket(PacketBuilder.CreateBattleMsg(setup.Attacker.Name + setup.Move.Name, Text.BrightRed));
            //    	}
            //BattleProcessor.NpcAttackPlayer(((MapNpc)setup.Attacker).MapSlot, recruit.Owner, damage);
            //    }
            //}
            if (setup.Defender != null) {
                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateSpellAnim(setup.Move.DefenderAnim, setup.Defender.X, setup.Defender.Y, setup.Defender.X, setup.Defender.Y, 0));
                //Messenger.SpellAnim(setup.Move, setup.Defender.MapID, setup.Defender.X, setup.Defender.Y);
            }

            Scripting.ScriptManager.InvokeSub("BeforeMoveHits", setup);

            if (setup.Cancel) {
                return;
            }

            Move move = setup.Move;

            if (setup.Hit == true) {
                switch (move.EffectType) {
                    case Enums.MoveType.SubHP: {
                            int damage = DamageCalculator.CalculateDamage(move.Data1, setup.AttackStat, setup.Attacker.Level, setup.DefenseStat) * setup.Multiplier / 1000;
                            if (damage < 0) damage = 0;
                            setup.Defender.HP -= damage;

                            if (damage <= 0 && setup.Multiplier > -1) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " took no damage!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                //BothWaysBattleMsg(setup, setup.Defender.Name + " took no damage!", Text.BrightRed);
                            } else if (damage > 0) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " took " + damage + " damage!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                                //BothWaysBattleMsg(setup, setup.Defender.Name + " took " + damage + " damage!", Text.BrightRed);
                            }

                            setup.Damage = damage;
                        }
                        break;
                    case Enums.MoveType.AddHP: {
                            //Todo?: messages for the other movetypes

                            if (setup.Defender.HP + move.Data1 > setup.Defender.MaxHP) {
                                setup.Defender.HP = setup.Defender.MaxHP;
                            } else {
                                setup.Defender.HP += move.Data1;
                            }

                        }
                        break;
                    case Enums.MoveType.SubMP: {

                            int randomSlot = Server.Math.Rand(0, 4);
                            if (setup.Defender.Moves[randomSlot].MoveNum > 0 && setup.Defender.Moves[randomSlot].CurrentPP > 0) {
                                setup.Defender.Moves[randomSlot].CurrentPP--;
                                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                    Recruit recruit = setup.Defender as Recruit;
                                    PacketBuilder.AppendMovePPUpdate(recruit.Owner, setup.PacketStack, randomSlot);
                                }
                            }// else {
                            //    for (int i = 0; i < setup.Defender.Moves.Length; i++) {
                            //        if (setup.Defender.Moves[i].MoveNum > 0 && setup.Defender.Moves[i].CurrentPP > 0) {
                            //            setup.Defender.Moves[i].CurrentPP--;
                            //            if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                            //                Recruit recruit = setup.Defender as Recruit;
                            //                Messenger.SendMovePPUpdate(recruit.Owner, i);
                            //            }
                            //            break;
                            //        }
                            //    }
                            //}

                        }
                        break;
                    case Enums.MoveType.AddMP: {

                            int randomSlot = Server.Math.Rand(0, 4);
                            if (setup.Defender.Moves[randomSlot].MoveNum > 0 && setup.Defender.Moves[randomSlot].CurrentPP < setup.Defender.Moves[randomSlot].MaxPP) {
                                setup.Defender.Moves[randomSlot].CurrentPP++;
                                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                                    Recruit recruit = setup.Defender as Recruit;
                                    PacketBuilder.AppendMovePPUpdate(recruit.Owner, setup.PacketStack, randomSlot);
                                }
                            }// else {
                            //    for (int i = 0; i < setup.Defender.Moves.Length; i++) {
                            //        if (setup.Defender.Moves[i].MoveNum > 0 && setup.Defender.Moves[i].CurrentPP < setup.Defender.Moves[i].MaxPP) {
                            //            setup.Defender.Moves[i].CurrentPP++;
                            //            if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                            //                Recruit recruit = setup.Defender as Recruit;
                            //                Messenger.SendMovePPUpdate(recruit.Owner, i);
                            //            }
                            //            break;
                            //        }
                            //    }
                            //}

                        }
                        break;
                    case Enums.MoveType.Scripted: {

                        Scripting.ScriptManager.InvokeSub("ScriptedMoveHitCharacter", setup);
                        }
                        break;
                }

            } else {

                if (setup.Defender != null) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg("The move missed " + setup.Defender.Name + "!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    //BothWaysBattleMsg(setup, "The move missed " + setup.Defender.Name + "!", Text.BrightRed);
                }

            }

            if (setup.Defender != null && setup.Defender.CharacterType == Enums.CharacterType.MapNpc) {
                if (setup.moveIndex > 0) {
                    ((MapNpc)setup.Defender).HitByMove = true;
                }
                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                    if (Ranks.IsDisallowed(((Recruit)setup.Attacker).Owner, Enums.Rank.Moniter) || ((Recruit)setup.Attacker).Owner.Player.Hunted) {
                        ((MapNpc)setup.Defender).Target = ((Recruit)setup.Attacker).Owner;
                        if (NpcManager.Npcs[((MapNpc)setup.Defender).Num].Behavior == Enums.NpcBehavior.Guard) {
                            for (int i = 0; i < Constants.MAX_MAP_NPCS; i++) {
                                if (setup.DefenderMap.ActiveNpc[i].Num == ((MapNpc)setup.Defender).Num) {
                                    setup.DefenderMap.ActiveNpc[i].Target = ((Recruit)setup.Attacker).Owner;
                                }
                            }

                        }
                    }
                }
            }

            if (!setup.Cancel) {
                if (setup.Move.PerPlayer) {
                    Scripting.ScriptManager.InvokeSub("MoveAdditionalEffect", setup);
                }
                Scripting.ScriptManager.InvokeSub("AfterMoveHits", setup);
            }

            if (setup.Defender != null && setup.Defender.HP <= 0 && setup.KnockedOut == false) {
                setup.Defender.HP = 1;
                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                    PacketBuilder.AppendHP(((Recruit)setup.Defender).Owner, setup.PacketStack);
                }
            }

            if (setup.Defender == null || setup.Defender.HP > 0) {
                setup.KnockedOut = false;
            }

            //if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
            //	Messenger.SendDataTo(((Recruit)setup.Defender).Owner, setup.DefenderPacketStack);
            //	setup.DefenderPacketStack = new PacketList();
            //}

            if (setup.KnockedOut) HandleDeath(setup);//""uncancellable
        }
示例#10
0
        public static void HandleAttack(BattleSetup setup)
        {
            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {//if player, check if he's playing
                if (NetworkManager.IsPlaying(((Recruit)setup.Attacker).Owner) == false) {
                    return;

                }
            } else {//if NPC, check if it exists
                if (((MapNpc)setup.Attacker).Num <= 0) {
                    return;
                }

            }

            //BattleSetup setup = new BattleSetup();
            //setup.Attacker = attacker;
            //setup.moveSlot = moveSlot;

            Scripting.ScriptManager.InvokeSub("BeforeMoveUsed", setup);

            if (!setup.Cancel) {
                ExecuteAttack(setup);
            }

            if (!setup.Cancel) {
                Scripting.ScriptManager.InvokeSub("AfterMoveUsed", setup);
            }
        }
示例#11
0
        public static void HandleDeath(BattleSetup setup)
        {
            IMap map = setup.DefenderMap;
            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                    Recruit defender = (Recruit)setup.Defender;
                    if (((Recruit)setup.Attacker).Owner.Player.Map.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena/* || defender.Owner.Player.PK == true*/) {
                        ((Recruit)setup.Attacker).Owner.Player.PokemonSeen(setup.Defender.Species);
                    }
                } else if (setup.Defender.CharacterType == Enums.CharacterType.MapNpc) {
                    ((Recruit)setup.Attacker).Owner.Player.PokemonSeen(setup.Defender.Species);
                }
            }

            if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                Recruit defender = (Recruit)setup.Defender;
                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("Oh, no!  " + defender.Name + " fainted!", Text.BrightRed));
                //Messenger.MapMsg(defender.MapID, "Oh, no!  " + defender.Name + " fainted!", Text.BrightRed);

                //if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit && setup.Attacker != setup.Defender) {
                //    if (((Recruit)setup.Defender).Owner.Player.Map.Tile[setup.Defender.X, setup.Defender.Y].Type != Enums.TileType.Arena && ((Recruit)setup.Attacker).Owner.Player.PK == false && defender.Owner.Player.PK == false) {
                //        ((Recruit)setup.Attacker).Owner.Player.PK = true;
                //        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateChatMsg(setup.Attacker.Name + " has been deemed an Outlaw!", Text.BrightRed));
                        //Messenger.GlobalMsg(setup.Attacker.Name + " has been deemed an Outlaw!", Text.BrightRed);
                //    }
                //}

                //if (defender.Owner.Player.PK == true) {
                //    defender.Owner.Player.PK = false;
                //    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateChatMsg(defender.Name + " has paid the price for being an Outlaw!", Text.BrightRed));
                    //Messenger.GlobalMsg(defender.Name + " has paid the price for being an Outlaw!", Text.BrightRed);
                //}

                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                    Scripting.ScriptManager.InvokeSub("OnDeath", setup.PacketStack, defender.Owner, Enums.KillType.Player);
                } else {
                    Scripting.ScriptManager.InvokeSub("OnDeath", setup.PacketStack, defender.Owner, Enums.KillType.Npc);
                }

                if (setup.Attacker == setup.Defender) setup.Cancel = true;

                bool allOut = true;
                foreach (Client client in map.GetClients()) {
                    if (client.Player.Hunted) {
                        allOut = false;
                    }
                }
                if (allOut) {
                    map.ProcessingPaused = true;
                }

            } else if (setup.Defender.CharacterType == Enums.CharacterType.MapNpc) {
                MapNpc defender = (MapNpc)setup.Defender;

                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {

                    if (defender.HeldItem != null) {
                        defender.MapDropItem(defender.HeldItem.Amount, ((Recruit)setup.Attacker).Owner);
                    }

                    Scripting.ScriptManager.InvokeSub("OnNpcDeath", setup.PacketStack, setup.Attacker, defender);

                    bool skipRecruit = false;

                    try {

                        if (!((Recruit)setup.Attacker).Owner.Player.Map.RecruitEnabled) {
                            skipRecruit = true;
                        }
                        if (NpcManager.Npcs[defender.Num].RecruitRate == 0) skipRecruit = true;
                        //if (((Recruit)setup.Attacker).Owner.Player.GetTeamSize() + Pokedex.Pokedex.GetPokemon(NpcManager.Npcs[defender.Num].Species).Size > 4) {
                        //    skipRecruit = true;
                        //}
                        //if (((Recruit)setup.Attacker).Owner.Player.PK) skipRecruit = true;

                        if (((Recruit)setup.Attacker).Owner.Player.RequestedRecruit != null) skipRecruit = true;

                        //if (((Recruit)setup.Attacker).Owner.Player.Team[0] != setup.Attacker) skipRecruit = true;
                        if (setup.Attacker.Level <= defender.Level) skipRecruit = true;
                    } catch { }

                    if (skipRecruit == false) {

                        int openSlot = ((Recruit)setup.Attacker).Owner.Player.FindOpenTeamSlot();
                        if (openSlot != -1) {

                            int bonus = ((Recruit)setup.Attacker).Owner.Player.GetRecruitBonus(defender);

                            int recruitRate = NpcManager.Npcs[defender.Num].RecruitRate;

                            if (Math.Rand(1, 1001) < (recruitRate + bonus)) {

                                ((Recruit)setup.Attacker).Owner.Player.AddToRequested((MapNpc)defender);

                            }
                        }
                    }

                    bool skipExp = false;
                    try {
                        if (!((Recruit)setup.Attacker).Owner.Player.Map.ExpEnabled) {
                            skipExp = true;
                        }

                        if (((Recruit)setup.Attacker).Owner.Player.GetActiveRecruit().Level == Exp.ExpManager.Exp.MaxLevels) {
                            skipExp = true;
                        }
                    } catch { }

                    if (!skipExp) {
                        ulong Exp = (ulong)Pokedex.Pokedex.GetPokemonForm(NpcManager.Npcs[defender.Num].Species, defender.Form).GetRewardExp(defender.Level);
                        if (!defender.HitByMove) {
                            Exp /= 2;
                        }
                        // Make sure we dont get less then 0
                        if (Exp < 0) {
                            Exp = 1;
                        }

                        Exp = (ulong)(Exp);

                        setup.ExpGained += Exp;

                    }

                } else {//attacker is null, or another npc
                    if (defender.HeldItem != null) {
                        defender.MapDropItem(defender.HeldItem.Amount, null);
                    }
                    Scripting.ScriptManager.InvokeSub("OnNpcDeath", setup.PacketStack, setup.Attacker, defender);

                }

                //reset NPC slot
                setup.DefenderMap.ClearActiveNpc(defender.MapSlot);

                setup.PacketStack.AddPacketToMap(setup.AttackerMap, TcpPacket.CreatePacket("npcdead", defender.MapSlot));
                //Messenger.SendDataToMap(defender.MapID, TcpPacket.CreatePacket("npcdead", defender.MapSlot));

            }
        }
示例#12
0
 public static void FinalizeAction(BattleSetup setup)
 {
     FinalizeAction(setup, null);
 }
示例#13
0
        public static void FinalizeAction(BattleSetup setup, PacketHitList parent)
        {
            Scripting.ScriptManager.InvokeSub("AfterActionTaken", setup);

            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                if (setup.AttackerMap.MapType == Enums.MapType.Standard) {
                    setup.ExpGained /= 2;
                }
                if (setup.ExpGained > 0) {

                    if (((Recruit)setup.Attacker).Owner.Player.PartyID == null) {
                        if (!(setup.Attacker.Level == Exp.ExpManager.Exp.MaxLevels)) {
                            Scripting.ScriptManager.InvokeSub("PlayerEXP", setup.packetStack, ((Recruit)setup.Attacker).Owner, setup.ExpGained);

                            CheckPlayerLevelUp(setup.PacketStack, ((Recruit)setup.Attacker).Owner);
                        }
                    } else {
                        Party party = PartyManager.FindPlayerParty(((Recruit)setup.Attacker).Owner);
                        if (party != null) {
                            party.HandoutExp(((Recruit)setup.Attacker).Owner, setup.ExpGained, setup.PacketStack);
                        }
                    }
                }
                //setup.PacketStack.AddPacket(((Recruit)setup.Attacker).Owner, PacketBuilder.CreateBattleDivider());
            }

            // Disable caching and build the hitlist to allow for post-processing
            setup.PacketStack.CachingEnabled = false;

            for (int i = 0; i < setup.PacketStack.HitList.Count; i++) {
                if (setup.PacketStack.HitList.ValueByIndex(i).ContainsPacket("battlemsg") && parent == null) {
                    setup.PacketStack.AddPacket(setup.PacketStack.HitList.KeyByIndex(i), PacketBuilder.CreateBattleDivider());
                }

            }

            if (parent != null) {
                parent.AddHitList(setup.PacketStack);
            } else {
                PacketHitList.MethodEnded(ref setup.packetStack);
            }
        }
示例#14
0
文件: MapNpc.cs 项目: pzaps/Server
        public void UseMoveOnFoes(BattleSetup setup, TargetCollection targets)
        {
            // Attack any players that are on the map
            //List<ICharacter> targets = MoveProcessor.GetTargetsInRange(setup.Move.RangeType, setup.Move.Range, setup.AttackerMap, this, X, Y, Direction);
            Move move = setup.SetdownMove();

            foreach (ICharacter i in targets.Foes) {
                setup.Defender = i;
                BattleProcessor.MoveHitCharacter(setup);
                setup.SetupMove(move);
                if (setup.Cancel) {
                    return;
                }
            }
        }
示例#15
0
        public static void CheckAttackerModAbility(BattleSetup setup)
        {
            if (HasAbility(setup.Attacker, "Adaptability")) {
                if (setup.Move.MoveCategory != Enums.MoveCategory.Status && (setup.Move.Element == setup.Attacker.Type1 || setup.Move.Element == setup.Attacker.Type2)) {
                    setup.AttackerMultiplier *= 6;
                    setup.AttackerMultiplier /= 5;
                }
            }
            if (HasAbility(setup.Attacker, "Blaze")) {
                if (setup.Move.MoveCategory != Enums.MoveCategory.Status
                && setup.Move.Element == Enums.PokemonType.Fire
                && setup.Attacker.HP <= setup.Attacker.MaxHP / 4) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Blaze boosted its power!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.AttackerMultiplier *= 3;
                    setup.AttackerMultiplier /= 2;
                }
            }
            if (HasAbility(setup.Attacker, "Compoundeyes")) {
                if (setup.Move.Accuracy != -1) {
                    setup.Move.Accuracy *= 13;
                    setup.Move.Accuracy /= 10;
                }
            }
            //Damp
            if (setup.moveIndex == 135 || setup.moveIndex == 196) {
                bool explode = true;
                TargetCollection checkedTargets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Floor, 0, setup.AttackerMap, null, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, true, true, false);
                for (int i = 0; i < checkedTargets.Count; i++) {
                    if (HasAbility(checkedTargets[i], "Damp")) {
                        setup.Move.TravelingAnim.AnimationIndex = -1;
                        setup.Move.DefenderAnim.AnimationIndex = -1;
                        SetAsNeutralizedMove(setup.Move);
                        explode = false;
                        break;
                    }
                }
                if (explode) {
                    if (setup.moveIndex == 135) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic215.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                    } else if (setup.moveIndex == 196) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic216.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                    }
                } else {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic320.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(505, setup.Attacker.X, setup.Attacker.Y));
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The damp conditions prevented an explosion!", Text.Blue), setup.Attacker.X, setup.Attacker.Y, 10);
                }
            }

            if (HasAbility(setup.Attacker, "Defeatist")) {
                if (setup.Attacker.HP < setup.Attacker.MaxHP / 2) {
                    setup.AttackStat /= 2;
                }
            }
            if (HasAbility(setup.Attacker, "Flare Boost")) {

                if (setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                    if (setup.Attacker.StatusAilment == Enums.StatusAilment.Burn) {
                        setup.AttackStat *= 3;
                        setup.AttackStat /= 2;
                    }
                }
            }
            if (HasAbility(setup.Attacker, "Guts")) {

                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                    if (setup.Attacker.StatusAilment == Enums.StatusAilment.Burn) {
                        setup.AttackStat *= 3;
                    } else if (setup.Attacker.StatusAilment != Enums.StatusAilment.OK) {
                        setup.AttackStat *= 3;
                        setup.AttackStat /= 2;
                    }
                }
            }
            if (HasAbility(setup.Attacker, "Huge Power")) {
                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                    //setup.PacketStack.AddPacketToMap(setup.Attacker.MapID, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Huge Power boosted its power!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.AttackerMultiplier *= 3;
                    setup.AttackerMultiplier /= 2;
                }

            }
            if (HasAbility(setup.Attacker, "Hustle")) {
                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                    setup.AttackerMultiplier *= 7;
                    setup.AttackerMultiplier /= 5;
                }
            }

            if (HasAbility(setup.Attacker, "Iron Fist")) {

                if (setup.moveIndex == 331 ||
                    setup.moveIndex == 329 ||
                    setup.moveIndex == 368 ||
                    setup.moveIndex == 460 ||
                    setup.moveIndex == 387 ||
                    setup.moveIndex == 333 ||
                    setup.moveIndex == 441 ||
                    setup.moveIndex == 399 ||
                    setup.moveIndex == 165 ||
                    setup.moveIndex == 330 ||
                    setup.moveIndex == 335 ||
                    setup.moveIndex == 400 ||
                    setup.moveIndex == 90 ||
                    setup.moveIndex == 334 ||
                    setup.moveIndex == 33) {
                    setup.AttackerMultiplier *= 6;
                    setup.AttackerMultiplier /= 5;
                }

            }

            //Plus and Minus
            if (HasAbility(setup.Attacker, "Minus")) {
                TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, false, true, false);
                for (int i = 0; i < targets.Friends.Count; i++) {
                    if (HasAbility(targets.Friends[i], "Plus")) {
                        setup.AttackerMultiplier *= 4;
                        setup.AttackerMultiplier /= 3;
                    }
                }
            }
            if (HasAbility(setup.Attacker, "Plus")) {
                TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, false, true, false);
                for (int i = 0; i < targets.Friends.Count; i++) {
                    if (HasAbility(targets.Friends[i], "Minus")) {
                        setup.AttackerMultiplier *= 4;
                        setup.AttackerMultiplier /= 3;
                    }
                }
            }
            if (HasAbility(setup.Attacker, "Prankster")) {
                if (setup.Move.MoveCategory == Enums.MoveCategory.Status) {
                    setup.Move.Range += 2;
                }
            }
            if (HasAbility(setup.Attacker, "Pure Power")) {
                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                    //setup.PacketStack.AddPacketToMap(setup.Attacker.MapID, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Pure Power boosted its power!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.AttackerMultiplier *= 4;
                    setup.AttackerMultiplier /= 3;
                }

            }
            if (HasAbility(setup.Attacker, "Overgrow")) {
                if (setup.Move.MoveCategory != Enums.MoveCategory.Status
                && setup.Move.Element == Enums.PokemonType.Grass
                && setup.Attacker.HP <= setup.Attacker.MaxHP / 4) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Overgrow boosted its power!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.AttackerMultiplier *= 3;
                    setup.AttackerMultiplier /= 2;
                }

            }
            if (HasAbility(setup.Attacker, "Reckless")) {
                if (setup.Move.EffectType == Enums.MoveType.SubHP && (setup.Move.AdditionalEffectData1 == 28 || setup.Move.AdditionalEffectData1 == 196)) {
                    setup.AttackerMultiplier *= 11;
                    setup.AttackerMultiplier /= 10;
                }

            }
            if (HasAbility(setup.Attacker, "Sand Force") && GetCharacterWeather(setup.Attacker) == Enums.Weather.Sandstorm) {
                if (setup.Move.Element == Enums.PokemonType.Ground || setup.Move.Element == Enums.PokemonType.Rock || setup.Move.Element == Enums.PokemonType.Steel) {
                    setup.AttackerMultiplier *= 6;
                    setup.AttackerMultiplier /= 5;
                }
            }
            if (HasAbility(setup.Attacker, "Serene Grace")) {
                switch (setup.Move.AdditionalEffectData1) {
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 14:
                    case 15:
                    case 16:
                    case 17:
                    case 18:
                    case 19:
                    case 20:
                    case 21:
                    case 22:
                    case 23:
                    case 24:
                    case 25:
                    case 26:
                    case 27:
                    case 35:
                    case 37:
                    case 38:
                    case 48:
                    case 49:
                    case 50:
                    case 51:
                    case 181: {
                            setup.Move.AdditionalEffectData2 *= 2;
                        }
                        break;
                }
            }
            if (HasAbility(setup.Attacker, "Sheer Force")) {
                switch (setup.Move.AdditionalEffectData1) {
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 21:
                    case 22:
                    case 23:
                    case 24:
                    case 25:
                    case 26:
                    case 27:
                    case 35:
                    case 37:
                    case 38:
                    case 48:
                    case 49:
                    case 50:
                    case 51: {
                            setup.Move.AdditionalEffectData2 = 0;
                            setup.AttackerMultiplier *= 6;
                            setup.AttackerMultiplier /= 5;
                        }
                        break;
                    case 14:
                    case 15:
                    case 16:
                    case 17:
                    case 18:
                    case 19:
                    case 20: {
                            if (setup.Move.AdditionalEffectData3 > 0) {
                                setup.Move.AdditionalEffectData2 = 0;
                                setup.AttackerMultiplier *= 6;
                                setup.AttackerMultiplier /= 5;
                            }
                        }
                        break;
                }
            }
            if (HasAbility(setup.Attacker, "Solar Power")) {

                if (GetCharacterWeather(setup.Attacker) == Enums.Weather.Sunny && setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                    setup.AttackStat *= 4;
                    setup.AttackStat /= 3;
                }
            }
            if (HasAbility(setup.Attacker, "Stall")) {
                if (setup.Move.MoveCategory != Enums.MoveCategory.Status && setup.Move.Range > 2) {
                    setup.Move.Range = 2;
                }
            }
            if (HasAbility(setup.Attacker, "Swarm")) {
                if (setup.Move.MoveCategory != Enums.MoveCategory.Status
                && setup.Move.Element == Enums.PokemonType.Bug
                && setup.Attacker.HP <= setup.Attacker.MaxHP / 4) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Swarm boosted its power!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.AttackerMultiplier *= 3;
                    setup.AttackerMultiplier /= 2;
                }

            }
            if (HasAbility(setup.Attacker, "Technician")) {
                if (setup.Move.EffectType == Enums.MoveType.SubHP && setup.Move.Data1 <= 60) {
                    setup.AttackerMultiplier *= 4;
                    setup.AttackerMultiplier /= 3;
                }

            }
            if (HasAbility(setup.Attacker, "Torrent")) {
                if (setup.Move.MoveCategory != Enums.MoveCategory.Status
                && setup.Move.Element == Enums.PokemonType.Water
                && setup.Attacker.HP <= setup.Attacker.MaxHP / 4) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Torrent boosted its power!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.AttackerMultiplier *= 3;
                    setup.AttackerMultiplier /= 2;
                }

            }
            if (HasAbility(setup.Attacker, "Toxic Boost")) {

                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                    if (setup.Attacker.StatusAilment == Enums.StatusAilment.Poison) {
                        setup.AttackStat *= 3;
                        setup.AttackStat /= 2;
                    }
                }
            }
        }
示例#16
0
        public static void ExecuteAttack(BattleSetup setup)
        {
            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {

                PacketBuilder.AppendAttackPacket(((Recruit)setup.Attacker).Owner, setup.PacketStack);

            } else {
                PacketBuilder.AppendNpcAttack(setup.AttackerMap, setup.PacketStack, ((MapNpc)setup.Attacker).MapSlot);
            }

            if (!string.IsNullOrEmpty(setup.Move.Name)) {
                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Move.Name, Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 16);
                //setup.PacketStack.AddPacket(PacketBuilder.CreateBattleMsg(((Recruit)setup.Attacker).Owner.Player.Name + setup.Move.Name, Text.WhiteSmoke));
            }

            if (setup.Move.Sound > 0) {
                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic" + setup.Move.Sound + ".wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                //Messenger.PlaySoundToMap(setup.Attacker.MapID, "magic" + setup.Move.Sound + ".wav");
            }

            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.AttackerAnim, setup.Attacker.X, setup.Attacker.Y, setup.Attacker.X, setup.Attacker.Y, 0));

            Scripting.ScriptManager.InvokeSub("AfterMoveExecuted", setup);

            bool hitsFoes = HitsFoes(setup.Move.TargetType);
            bool hitsAllies = HitsAllies(setup.Move.TargetType);

            TargetCollection targets = MoveProcessor.GetTargetsInRange(setup.Move.RangeType, setup.Move.Range, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, setup.Attacker.Direction, hitsFoes, hitsAllies, false);

            if (hitsFoes) {
                setup.Attacker.UseMoveOnFoes(setup, targets);
            }

            if (hitsAllies) {
                setup.Attacker.UseMoveOnAllies(setup, targets);
            }

            if (HitsSelf(setup.Move.TargetType)) {
                setup.Defender = setup.Attacker;
                MoveHitCharacter(setup);
                if (setup.Cancel) {
                    return;
                }

            }

            if (setup.Move.TargetType == Enums.MoveTarget.NoOne) {
                setup.Defender = null;
                MoveHitCharacter(setup);
                if (setup.Cancel) {
                    return;
                }
            }

            switch (setup.Move.TravelingAnim.AnimationType) {
                case Enums.MoveAnimationType.Normal: {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, setup.Attacker.X, setup.Attacker.Y, 0));
                    }
                    break;
                case Enums.MoveAnimationType.Overlay: {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, setup.Attacker.X, setup.Attacker.Y, 0));
                    }
                    break;
                case Enums.MoveAnimationType.Arrow:
                case Enums.MoveAnimationType.ItemArrow: {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, (int)setup.Attacker.Direction, setup.Move.Range, 0));
                    }
                    break;
                case Enums.MoveAnimationType.Throw:
                case Enums.MoveAnimationType.ItemThrow: {
                        if (setup.Defender == null) {
                            switch (setup.Attacker.Direction) {
                                case Enums.Direction.Up: {
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, 0, -2, 0));
                                    }
                                    break;
                                case Enums.Direction.Down: {
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, 0, 2, 0));
                                    }
                                    break;
                                case Enums.Direction.Left: {
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, -2, 0, 0));
                                    }
                                    break;
                                case Enums.Direction.Right: {
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, 2, 0, 0));
                                    }
                                    break;
                            }
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, setup.Defender.X - setup.Attacker.X, setup.Defender.Y - setup.Attacker.Y, 0));
                        }
                    }
                    break;
                case Enums.MoveAnimationType.Beam: {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, (int)setup.Attacker.Direction, setup.Move.Range, 0));
                    }
                    break;
                case Enums.MoveAnimationType.Tile: {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(setup.Move.TravelingAnim, setup.Attacker.X, setup.Attacker.Y, (int)setup.Move.RangeType, (int)setup.Attacker.Direction, setup.Move.Range));
                    }
                    break;
            }

            if (!setup.Move.PerPlayer && !setup.Cancel) {
                Scripting.ScriptManager.InvokeSub("MoveAdditionalEffect", setup);
            }
        }
示例#17
0
        public static void CheckDefenderModAbility(BattleSetup setup)
        {
            ExtraStatus status;

            if (HasAbility(setup.Attacker, "Analytic")) {
                status = setup.Attacker.VolatileStatus.GetStatus("LastHitBy");
                if (status != null && status.Target == setup.Defender) {
                    setup.Multiplier *= 5;
                    setup.Multiplier /= 4;
                }
            }
            if (HasAbility(setup.Defender, "Anticipation") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                int effectiveness = DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type1) + DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type2);
                if (effectiveness > 6 && setup.Move.MoveCategory != Enums.MoveCategory.Status && setup.Move.Accuracy != -1) {
                    setup.Move.Accuracy *= 4;
                    setup.Move.Accuracy /= 5;
                }
            }
            if (HasAbility(setup.Defender, "Dry Skin") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Fire) {
                    setup.Multiplier *= 5;
                    setup.Multiplier /= 4;
                }
            }
            if (HasAbility(setup.Defender, "Filter") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                int effectiveness = DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type1) + DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type2);
                if (effectiveness > 6 && setup.Move.MoveCategory != Enums.MoveCategory.Status) {
                    setup.Multiplier *= 288;
                    setup.Multiplier /= 416;
                    //setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " avoided damage with Wonder Guard!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                }
            }
            if (HasAbility(setup.Defender, "Forewarn") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Data1 >= 80 && setup.Move.EffectType != Enums.MoveType.SubHP && setup.Move.Accuracy != -1) {
                    setup.Move.Accuracy *= 4;
                    setup.Move.Accuracy /= 5;
                }
            }

            //Friend Guard
            if (!HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.EffectType == Enums.MoveType.SubHP) {
                    TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.DefenderMap, setup.Defender, setup.Defender.X, setup.Defender.Y, Enums.Direction.Up, false, true, false);
                    for (int i = 0; i < targets.Friends.Count; i++) {
                        if (HasAbility(targets.Friends[i], "Friend Guard")) {
                            setup.Multiplier *= 4;
                            setup.Multiplier /= 5;
                        }
                    }
                }
            }

            if (HasAbility(setup.Defender, "Heatproof") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Fire) {
                    setup.Multiplier /= 3;
                }
            }
            if (HasAbility(setup.Attacker, "Hustle")) {
                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical && setup.Move.Accuracy != -1) {
                    setup.Move.Accuracy *= 8;
                    setup.Move.Accuracy /= 10;
                }
            }
            if (HasAbility(setup.Defender, "Intimidate") && MoveProcessor.GetMatchupWith(setup.Defender, setup.Attacker) == Enums.CharacterMatchup.Foe) {
                if (Server.Math.Rand(0, 3) == 0 && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Intimidate affected " + setup.Attacker.Name + "!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    ChangeAttackBuff(setup.Attacker, setup.Defender, setup.AttackerMap, -1, setup.PacketStack);
                }
            }

            if (HasAbility(setup.Defender, "Levitate") && IsGroundImmune(setup.Defender, setup.DefenderMap) && setup.Defender != setup.Attacker && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Ground) {
                    setup.Move.Accuracy = 0;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " avoided damage with Levitate!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                }
            }

            if (HasAbility(setup.Defender, "Marvel Scale") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical
                && setup.Defender.StatusAilment != Enums.StatusAilment.OK) {
                    setup.Multiplier *= 2;
                    setup.Multiplier /= 3;
                }
            }

            if (HasAbility(setup.Defender, "Multiscale") && setup.Defender.HP == setup.Defender.MaxHP && !HasAbility(setup.Attacker, "Mold Breaker")) {
                setup.Multiplier /= 2;
            }

            if (HasAbility(setup.Defender, "Tangled Feet") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe
                && setup.Move.Accuracy != -1 && setup.Defender.VolatileStatus.GetStatus("Confusion") != null && !HasAbility(setup.Attacker, "Mold Breaker")) {
                    setup.Move.Accuracy /= 2;
            }
            if (HasAbility(setup.Attacker, "Rivalry")) {
                if (setup.Attacker.Sex == setup.Defender.Sex) {
                    setup.Multiplier *= 11;
                    setup.Multiplier /= 10;
                }
            }
            if (HasAbility(setup.Defender, "Sand Veil") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (GetCharacterWeather(setup.Defender) == Enums.Weather.Sandstorm && setup.Move.Accuracy != -1) {
                    setup.Move.Accuracy *= 4;
                    setup.Move.Accuracy /= 5;
                }
            }
            if (HasAbility(setup.Defender, "Snow Cloak") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (GetCharacterWeather(setup.Defender) == Enums.Weather.Hail && setup.Move.Accuracy != -1) {
                    setup.Move.Accuracy *= 4;
                    setup.Move.Accuracy /= 5;
                }
            }
            if (HasAbility(setup.Defender, "Solid Rock") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                int effectiveness = DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type1) + DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type2);
                if (effectiveness > 6 && setup.Move.MoveCategory != Enums.MoveCategory.Status) {
                    setup.Multiplier *= 288;
                    setup.Multiplier /= 416;
                }
            }

            //Bulletproof
            if (HasAbility(setup.Defender, "Bulletproof") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.moveIndex == 624 || //Acid Spray
                    setup.moveIndex == 70 || //Aura Sphere
                    setup.moveIndex == 219 || //Barrage
                    setup.moveIndex == 1 || //Bullet Seed
                    setup.moveIndex == 71 || //Egg Bomb
                    setup.moveIndex == 619 || //Electro Ball
                    setup.moveIndex == 378 || //Energy Ball
                    setup.moveIndex == 23 || //Focus Blast
                    setup.moveIndex == 47 || //Gyro Ball
                    setup.moveIndex == 429 || //Ice Ball
                    setup.moveIndex == 391 || //Magnet Bomb
                    setup.moveIndex == 375 || //Mist Ball
                    setup.moveIndex == 150 || //Mud Bomb
                    setup.moveIndex == 412 || //Octazooka
                    setup.moveIndex == 427 || //Rock Wrecker
                    setup.moveIndex == 678 || //Searing Shot
                    setup.moveIndex == 65 || //Seed Bomb
                    setup.moveIndex == 87 || //Shadow Ball
                    setup.moveIndex == 300 || //Sludge Bomb
                    setup.moveIndex == 446 || //Weather Ball
                    setup.moveIndex == 252){ // Zap Canon
                    setup.Move.Accuracy = 0;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " avoided damage with Bulletproof!", Text.WhiteSmoke));
                        }
                        }

            if (HasAbility(setup.Defender, "Soundproof") && !HasAbility(setup.Attacker, "Mold Breaker")) {

                if (setup.moveIndex == 180 ||
                    setup.moveIndex == 447 ||
                    setup.moveIndex == 630 ||
                    setup.moveIndex == 99 ||
                    setup.moveIndex == 105 ||
                    setup.moveIndex == 225 ||
                    setup.moveIndex == 317 ||
                    setup.moveIndex == 266 ||
                    setup.moveIndex == 680 ||
                    setup.moveIndex == 193 ||
                    setup.moveIndex == 629 ||
                    setup.moveIndex == 157 ||
                    setup.moveIndex == 372 ||
                    setup.moveIndex == 688 ||
                    setup.moveIndex == 311 ||
                    setup.moveIndex == 222 ||
                    setup.moveIndex == 210 ||
                    setup.moveIndex == 733 ||
                    setup.moveIndex == 703 ||
                    setup.moveIndex == 705 ||
                    setup.moveIndex == 708 ||
                    setup.moveIndex == 737) {
                    setup.Move.Accuracy = 0;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " avoided damage with Soundproof!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                }

            }
            if (HasAbility(setup.Defender, "Sturdy") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 39) {
                    setup.Move.Data1 = 0;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Sturdy prevents 1-Hit KO moves!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                } else if (setup.Defender.HP == setup.Defender.MaxHP) {
                    setup.KnockedOut = false;
                }
            }
            if (HasAbility(setup.Defender, "Thick Fat") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                if (setup.Move.Element == Enums.PokemonType.Fire
                || setup.Move.Element == Enums.PokemonType.Ice) {
                    setup.Multiplier *= 2;
                    setup.Multiplier /= 3;
                }
            }
            if (HasAbility(setup.Attacker, "Tinted Lens")) {
                int effectiveness = DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type1) + DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type2);
                if (effectiveness < 6 && setup.Move.MoveCategory != Enums.MoveCategory.Status) {
                    setup.Multiplier *= 250;
                    setup.Multiplier /= 160;
                }
            }
            if (HasAbility(setup.Defender, "Wonder Guard") && !HasAbility(setup.Attacker, "Mold Breaker")) {
                int effectiveness = DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type1) + DamageCalculator.CalculateTypeMatchup(setup.Move.Element, setup.Defender.Type2);
                if (effectiveness < 7 && setup.Move.MoveCategory != Enums.MoveCategory.Status && setup.Move.Element != Enums.PokemonType.None) {
                    setup.Move.Accuracy = 0;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " avoided damage with Wonder Guard!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                }
            }
            if (HasActiveBagItem(setup.Defender, 41, (int)GetCharacterWeather(setup.Defender), -1) || HasActiveBagItem(setup.Defender, 41, -1, (int)GetCharacterWeather(setup.Defender)) && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (setup.Move.Accuracy != -1) {
                    setup.Move.Accuracy *= 3;
                    setup.Move.Accuracy /= 5;
                }
            }
        }
示例#18
0
文件: Main.cs 项目: MandL27/Server
        public static void ScriptedItem(BattleSetup setup, InventoryItem item, int invNum)
        {
            try {
                // Called when a scripted item is used
                ExtraStatus status;

                int itemNum = item.Num;

                int itemEdibility = CheckItemEdibility(itemNum);

                if (itemEdibility == 3 && HasAbility(setup.Attacker, "Harvest") && GetBattleTagArg(setup.BattleTags, "Harvest", 0) == null) {

                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " harvested the berry!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    BattleSetup extraSetup = new BattleSetup();
                    extraSetup.Attacker = setup.Attacker;
                    extraSetup.BattleTags.Add("Harvest");
                    BattleProcessor.HandleItemUse(item, -1, extraSetup);
                    setup.PacketStack.AddHitList(extraSetup.PacketStack);
                }

                switch (itemEdibility) {
                    case 0: {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " used the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                    case 1: {//apple
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " ate the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic143.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                    case 2: {//gummi
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " ate the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic145.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                    case 3: {//berry
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " ate the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic144.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "AteBerry", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 4: {//seed
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " ate the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic144.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                    case 5: {//herb
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " ate the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic144.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                    case 6: {//poffin
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " ate the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                    case 7: {//bad food
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " ate the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic143.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                    case 8: {//drink
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " drank the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic142.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                    case 9: {//other consumable
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " ate the " + ItemManager.Items[itemNum].Name + ".", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic143.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                        }
                        break;
                }

                switch (ItemManager.Items[itemNum].Data1) {
                    case 0: {
                        }
                        break;
                    case 1: {
                            //Level-Up
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            int leveldiff = 100 - setup.Attacker.Level;
                            if (leveldiff > ItemManager.Items[itemNum].Data2) {
                                leveldiff = ItemManager.Items[itemNum].Data2;
                            }

                            if (leveldiff < 1) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened.", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else {
                                for (int i = 0; i < leveldiff; i++) {
                                    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                        Client client = ((Recruit)setup.Attacker).Owner;
                                        client.Player.GetActiveRecruit().Exp = client.Player.GetActiveRecruit().GetNextLevel();
                                        PlayerLevelUp(setup.PacketStack, client);
                                    } else {
                                        ((MapNpc)setup.Attacker).Level++;
                                    }
                                }
                            }
                        }
                        break;
                    case 2: {
                            //Escape Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                //if (client.Player.PK == true) {
                                //    Messenger.PlayerMsg(client, "An outlaw cannot escape!", Text.BrightRed);
                                Escape(client);

                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " escaped from the dungeon!", Text.Yellow), setup.Attacker.X, setup.Attacker.Y, 10);
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("escape.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                                setup.AttackerMap.ActiveNpc[((MapNpc)setup.Attacker).MapSlot] = new MapNpc(setup.Attacker.MapID, ((MapNpc)setup.Attacker).MapSlot);
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, TcpPacket.CreatePacket("npcdead", ((MapNpc)setup.Attacker).MapSlot));
                            }
                        }
                        break;
                    case 3: {
                            //Adds a stat
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            int rand = ItemManager.Items[itemNum].Data2;
                            switch (rand) {
                                case 0: {
                                        setup.Attacker.MaxHPBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Maximum HP was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 1: {
                                        setup.Attacker.AtkBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Attack was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 2: {
                                        setup.Attacker.DefBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Defense was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 3: {
                                        setup.Attacker.SpclAtkBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Special Attack was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 4: {
                                        setup.Attacker.SpclDefBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Special Defense was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 5: {
                                        setup.Attacker.SpdBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Speed was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                            }

                            setup.Attacker.CalculateOriginalStats();
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                PacketBuilder.AppendStats(client, setup.PacketStack);
                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);

                        }
                        break;
                    case 4: {
                            //Chamber Key
                            int x = setup.Attacker.X;
                            int y = setup.Attacker.Y;
                            MoveInDirection(setup.Attacker.Direction, 1, ref x, ref y);
                            if (x >= 0 && x <= setup.AttackerMap.MaxX && y >= 0 && y <= setup.AttackerMap.MaxY) {
                                Tile tile = setup.AttackerMap.Tile[x, y];
                                if (tile.Type == Enums.TileType.ScriptedSign && tile.Data1 == 10) {
                                    TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                    string[] start = tile.String1.Split(':');
                                    string[] end = tile.String2.Split(':');

                                    ClearChamber(setup.AttackerMap, x + start[0].ToInt(), y + start[1].ToInt(), x + end[0].ToInt(), y + end[1].ToInt(), setup.PacketStack);
                                }
                            }
                        }
                        break;
                    case 5: {
                            //fossil revival
                       if (Server.Globals.ServerTime == Enums.Time.Night) {
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {

                                Client client = ((Recruit)setup.Attacker).Owner;
                                IMap map = client.Player.Map;

                                if (map.Tile[client.Player.X, client.Player.Y].Type == Enums.TileType.Scripted && map.Tile[client.Player.X, client.Player.Y].Data1 == 71) {
                                    TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                    //Messenger.PlayerMsg(client, "And then " + Pokedex.GetPokemon(ItemManager.Items[itemNum].Data2).Name + " appears.", Text.Pink);
                                    map.SetTile(9, 0, 0, 1, 7);
                                    map.SetTile(9, 0, 0, 1, 8);
                                    setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateTilePacket(9, 0, map));
                                    map.SetTile(9, 1, 0, 1, 7);
                                    map.SetTile(9, 1, 0, 1, 8);
                                    setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateTilePacket(9, 1, map));
                                    map.SetTile(9, 2, 0, 1, 7);
                                    map.SetTile(9, 2, 0, 1, 8);
                                    setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateTilePacket(9, 2, map));
                                    map.SetAttribute(9, 3, Enums.TileType.Walkable, 0, 0, 0, "", "", "");
                                    setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateTilePacket(9, 3, map));

                                    Story story = new Story();
                                    StoryBuilderSegment segment = StoryBuilder.BuildStory();
                                    StoryBuilder.AppendPlayMusicAction(segment, "PMD2) Growing Anxiety.ogg", true, true);
                                    StoryBuilder.AppendRunScriptAction(segment, 5, "magic654.wav", "", "", true);
                                            StoryBuilder.AppendSaySegment(segment, "The moonlight bathes the " + ItemManager.Items[itemNum].Name + " in its mysterious red glow...", -1, 0, 0);
                                            StoryBuilder.AppendSaySegment(segment, "The " + ItemManager.Items[itemNum].Name + " is glowing with an intense, ancient power...!", -1, 0, 0);
                                            StoryBuilder.AppendMapVisibilityAction(segment, false);
                                            StoryBuilder.AppendRunScriptAction(segment, 5, "magic685.wav", "", "", true);
                                            StoryBuilder.AppendSaySegment(segment, "!!!!!!!!!", -1, 0, 0);
                                            StoryBuilder.AppendRunScriptAction(segment, 5, "magic648.wav", "", "", true);
                                            StoryBuilder.AppendWarpAction(segment, client.Player.Map.MapID, 9, 12);
                                            StoryBuilder.AppendMapVisibilityAction(segment, true);
                                            StoryBuilder.AppendCreateFNPCAction(segment, "0", "s-2", 9, 3, ItemManager.Items[itemNum].Data2);
                                            StoryBuilder.AppendChangeFNPCDirAction(segment, "0", Enums.Direction.Up);
                                            StoryBuilder.AppendSaySegment(segment, Pokedex.GetPokemon(ItemManager.Items[itemNum].Data2).Name + " was revived from the fossil!", -1, 0, 0);
                                            StoryBuilder.AppendPauseAction(segment, 200);
                                            StoryBuilder.AppendChangeFNPCDirAction(segment, "0", Enums.Direction.Right);
                                            StoryBuilder.AppendPauseAction(segment, 200);
                                            StoryBuilder.AppendChangeFNPCDirAction(segment, "0", Enums.Direction.Left);
                                            StoryBuilder.AppendPauseAction(segment, 200);
                                            StoryBuilder.AppendChangeFNPCDirAction(segment, "0", Enums.Direction.Right);
                                            StoryBuilder.AppendPauseAction(segment, 200);
                                            StoryBuilder.AppendChangeFNPCDirAction(segment, "0", Enums.Direction.Left);
                                            StoryBuilder.AppendPauseAction(segment, 200);
                                            StoryBuilder.AppendSaySegment(segment, "It's looking around desperately, as if confused...", -1, 0, 0);
                                            StoryBuilder.AppendChangeFNPCDirAction(segment, "0", Enums.Direction.Down);
                                            StoryBuilder.AppendSaySegment(segment, "...It seems to take your presence as a threat!  It's going to attack!", -1, 0, 0);
                                            StoryBuilder.AppendDeleteFNPCAction(segment, "0");
                                            StoryBuilder.AppendPlayMusicAction(segment, "St2) Elite 4 Battle 2.ogg", true, true);
                                            StoryBuilder.AppendRunScriptAction(segment, 46, ItemManager.Items[itemNum].Data2.ToString(), "25", "0", false);

                                    segment.AppendToStory(story);
                                    StoryManager.PlayStory(client, story);

                                }
                            }
                          }
                        }
                        break;
                    case 6: {
                            //level down
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (!setup.Attacker.HasActiveItem(92) && setup.Attacker.Level > 1) {
                                int negative = ItemManager.Items[itemNum].Data2;
                                if (negative > setup.Attacker.Level - 1) negative = setup.Attacker.Level - 1;
                                setup.Attacker.Level -= negative;
                                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                    Client client = ((Recruit)setup.Attacker).Owner;
                                    client.Player.GetActiveRecruit().Exp = client.Player.GetActiveRecruit().GetNextLevel() - 1;
                                }
                                setup.Attacker.CalculateOriginalStats();
                                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                    Client client = ((Recruit)setup.Attacker).Owner;
                                    PacketBuilder.AppendStats(client, setup.PacketStack);
                                }
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " dropped to level " + setup.Attacker.Level + "!", Text.BrightRed));
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap,  PacketBuilder.CreateBattleMsg("But nothing happened.", Text.WhiteSmoke));
                            }
                        }
                        break;
                    case 7: {
                            //level 1
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (!setup.Attacker.HasActiveItem(92)) {
                                setup.Attacker.Level = 1;
                                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                    Client client = ((Recruit)setup.Attacker).Owner;
                                    client.Player.GetActiveRecruit().Exp = 0;
                                }
                                setup.Attacker.AtkBonus = 0;
                                setup.Attacker.DefBonus = 0;
                                setup.Attacker.SpdBonus = 0;
                                setup.Attacker.SpclAtkBonus = 0;
                                setup.Attacker.SpclDefBonus = 0;
                                setup.Attacker.CalculateOriginalStats();
                                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                    Client client = ((Recruit)setup.Attacker).Owner;
                                    PacketBuilder.AppendStats(client, setup.PacketStack);
                                }
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " dropped to level 1!", Text.Magenta));
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap,  PacketBuilder.CreateBattleMsg("But nothing happened.", Text.WhiteSmoke));
                            }
                        }
                        break;
                    case 8: {
                            //Adds Speed

                        }
                        break;
                    case 9: {
                            //adds a random stat
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            int rand = Server.Math.Rand(0, 6);
                            switch (rand) {
                                case 0: {
                                        setup.Attacker.MaxHPBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Maximum HP was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 1: {
                                        setup.Attacker.AtkBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Attack was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 2: {
                                        setup.Attacker.DefBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Defense was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 3: {
                                        setup.Attacker.SpclAtkBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Special Attack was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 4: {
                                        setup.Attacker.SpclDefBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Special Defense was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                                case 5: {
                                        setup.Attacker.SpdBonus += ItemManager.Items[itemNum].Data3;
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Speed was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    break;
                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);

                        }
                        break;
                    case 10: {//Adds all stats
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);

                            setup.Attacker.MaxHPBonus += ItemManager.Items[itemNum].Data3;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Maximum HP was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Attacker.AtkBonus += ItemManager.Items[itemNum].Data3;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Attack was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Attacker.DefBonus += ItemManager.Items[itemNum].Data3;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Defense was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Attacker.SpclAtkBonus += ItemManager.Items[itemNum].Data3;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Special Attack was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Attacker.SpclDefBonus += ItemManager.Items[itemNum].Data3;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Special Defense was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Attacker.SpdBonus += ItemManager.Items[itemNum].Data3;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Speed was boosted!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);

                        }
                        break;
                    case 11: {
                            //Full HP recovery
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            //if (GetBattleTagArg(setup.BattleTags, "Gluttony", 0) != null) {
                            //HealCharacter(setup.Attacker, setup.AttackerMap, ItemManager.Items[itemNum].Data2 + GetBattleTagArg(setup.BattleTags, "Gluttony", 0).ToInt(), setup.PacketStack);
                            //} else {
                            HealCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP, setup.PacketStack);
                            //}
                            HealCharacterBelly(setup.Attacker, ItemManager.Items[itemNum].Data3, setup.PacketStack);
                        }
                        break;
                    case 12: {
                            //Box
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                //TODO: check if the player has a key, and ask to open with the key
                                Messenger.PlaySoundToMap(client.Player.MapID, "magic669.wav");
                                Messenger.PlayerMsg(client, "The box is locked shut.  Perhaps there's someone who knows how to open it...", Text.Cyan);
                                /*
                                if (client.Player.Map.Moral == Enums.MapMoral.Safe || client.Player.Map.Moral == Enums.MapMoral.House) {
                                    Messenger.PlayerMsg(client, "You opened up the " + ItemManager.Items[itemNum].Name + "!", Text.Yellow);
                                    string[] itemSelection = client.Player.Inventory[invNum].Tag.Split(';');
                                    string[] chosenItem = itemSelection[Server.Math.Rand(0, itemSelection.Length)].Split(',');
                                    client.Player.TakeItemSlot(invNum, 1, true);
                                    if (chosenItem[0].IsNumeric()) {
                                        if (chosenItem.Length > 1 && chosenItem[1].IsNumeric()) {
                                            client.Player.GiveItem(chosenItem[0].ToInt(), chosenItem[1].ToInt());
                                            Messenger.PlayerMsg(client, "Inside was " + chosenItem[1] + " " + ItemManager.Items[chosenItem[0].ToInt()].Name + "!", Text.Yellow);
                                        } else {
                                            client.Player.GiveItem(chosenItem[0].ToInt(), 1);
                                            Messenger.PlayerMsg(client, "Inside was a " + ItemManager.Items[chosenItem[0].ToInt()].Name + "!", Text.Yellow);
                                        }
                                    } else {
                                        Messenger.PlayerMsg(client, "But there was nothing inside...", Text.Yellow);
                                    }
                                } else {
                                    Messenger.PlayerMsg(client, "This item cannot be opened in dungeons!", Text.BrightRed);
                                }
                                */
                            }
                        }
                        break;
                    case 13: {
                            //Unknown Effect Mushroom
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);

                            string[] effects = item.Tag.Split(';');
                            for (int i = 0; i < effects.Length; i++) {
                                //trigger each effect

                            }

                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 14: {
                            //herbal tea
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            HealCharacter(setup.Attacker, setup.AttackerMap, 100, setup.PacketStack);
                            HealCharacterPP(setup.Attacker, setup.AttackerMap, 10, setup.PacketStack);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "Yawn", 3, null, "", setup.PacketStack);

                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 15: {
                            //warp seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.AttackerMap.MapType == Enums.MapType.RDungeonMap) {
                                RandomWarp(setup.Attacker, setup.AttackerMap, true, setup.PacketStack);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 16: {
                            //Single Nonvolatile Status Berry
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.Attacker.StatusAilment == (Enums.StatusAilment)ItemManager.Items[itemNum].Data2) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                            } else {
                                //setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Status Guard", 10, null, ItemManager.Items[itemNum].Data2.ToString(), setup.PacketStack);
                            }
                            HealCharacterBelly(setup.Attacker, ItemManager.Items[itemNum].Data3, setup.PacketStack);
                        }
                        break;
                    case 17: {
                            //HP recovery
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            //if (GetBattleTagArg(setup.BattleTags, "Gluttony", 0) != null) {
                            //HealCharacter(setup.Attacker, setup.AttackerMap, ItemManager.Items[itemNum].Data2 + GetBattleTagArg(setup.BattleTags, "Gluttony", 0).ToInt(), setup.PacketStack);
                            //} else {
                            if (ItemManager.Items[itemNum].Data2 >= 0) {
                                HealCharacter(setup.Attacker, setup.AttackerMap, ItemManager.Items[itemNum].Data2, setup.PacketStack);
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, ItemManager.Items[itemNum].Data2, Enums.KillType.Other, setup.PacketStack, true);
                            }
                            //}
                            HealCharacterBelly(setup.Attacker, ItemManager.Items[itemNum].Data3, setup.PacketStack);
                        }
                        break;
                    case 18: {
                            //PP recovery
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            HealCharacterPP(setup.Attacker, setup.AttackerMap, ItemManager.Items[itemNum].Data2, setup.PacketStack);

                            HealCharacterBelly(setup.Attacker, ItemManager.Items[itemNum].Data3, setup.PacketStack);
                        }
                        break;
                    case 19: {
                            //Belly recovery
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {

                                if (((Recruit)setup.Attacker).Belly < ((Recruit)setup.Attacker).MaxBelly) {

                                    if (ItemManager.Items[itemNum].Data2 >= 1000 && ((Recruit)setup.Attacker).MaxBelly < 200) {
                                        ((Recruit)setup.Attacker).MaxBelly += (ItemManager.Items[itemNum].Data2 / 100);
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s belly size increased!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }

                                    HealCharacterBelly(setup.Attacker, ItemManager.Items[itemNum].Data2, setup.PacketStack);

                                } else {
                                    ((Recruit)setup.Attacker).MaxBelly += ItemManager.Items[itemNum].Data3;
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s belly size increased!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                    HealCharacterBelly(setup.Attacker, ItemManager.Items[itemNum].Data3, setup.PacketStack);
                                }
                                if (((Recruit)setup.Attacker).MaxBelly > 200 && ((Recruit)setup.Attacker).MaxBelly < 200) {
                                    ((Recruit)setup.Attacker).MaxBelly = 200;
                                }
                                if (((Recruit)setup.Attacker).Belly > ((Recruit)setup.Attacker).MaxBelly) {
                                    ((Recruit)setup.Attacker).Belly = ((Recruit)setup.Attacker).MaxBelly;
                                }
                                PacketBuilder.AppendBelly(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            }
                        }
                        break;
                    case 20: {
                            //Multi-Belly recovery
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                for (int i = 0; i < Constants.MAX_ACTIVETEAM; i++) {
                                   	if (client.Player.Team[i] != null && client.Player.Team[i].Loaded) {
                                   		HealCharacterBelly(client.Player.Team[i], ItemManager.Items[itemNum].Data2, setup.PacketStack);
                                    }
                                }
                            }
                        }
                        break;
                    case 21: {
                            //sweet heart
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            int add = 5;
                            TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Floor, 0, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, false, true, false);
                            for (int i = 0; i < targets.Friends.Count; i++) {
                                int dx = setup.Attacker.X - targets[i].X;
                                int dy = setup.Attacker.Y - targets[i].Y;
                                if (dx < 2 && dy < 2) {
                                    add += 5;
                                } else if (dx < 8 && dy < 8) {
                                    add += 4;
                                } else if (dx < 16 && dy < 16) {
                                    add += 3;
                                } else {
                                    add += 2;
                                }
                            }
                            if (add > 5) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The feelings of nearby friends made it sweeter!", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                            HealCharacter(setup.Attacker, setup.AttackerMap, add*4, setup.PacketStack);
                            HealCharacterPP(setup.Attacker, setup.AttackerMap, add, setup.PacketStack);

                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 22: {
                            //casteliacone
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            //HealCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP, setup.PacketStack);
                            HealCharacterPP(setup.Attacker, setup.AttackerMap, 100, setup.PacketStack);
                            SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                            if (Server.Math.Rand(0, 3) == 0 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Freeze.ToString(), false, setup.PacketStack)) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Freeze, 0, setup.PacketStack);
                            }

                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 23: { // Pounce Orb
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                client.Player.TakeItemSlot(invNum, 1, true);
                                IMap map = client.Player.Map;
                                Messenger.MapMsg(map.MapID, client.Player.Name + " used a Pounce Orb!", Text.BrightCyan);
                                int npc = FindNearestNpc(client);
                                int playerX = client.Player.X;
                                int playerY = client.Player.Y;
                                if (IsPathClear(client, npc)) {
                                    MapNpc activeNpc = map.ActiveNpc[npc];
                                    if (playerX == activeNpc.X) {
                                        if (playerY > activeNpc.Y) {
                                            Messenger.PlayerWarp(client, map, playerX, activeNpc.Y + 1);
                                        } else {
                                            Messenger.PlayerWarp(client, map, playerX, activeNpc.Y - 1);
                                        }
                                    } else {
                                        if (playerX > activeNpc.X) {
                                            Messenger.PlayerWarp(client, map, activeNpc.X + 1, playerY);
                                        } else {
                                            Messenger.PlayerWarp(client, map, activeNpc.X - 1, playerY);
                                        }
                                    }
                                } else {
                                    int blockX = 0;
                                    int blockY = 0;
                                    FindNearestBlock(setup.AttackerMap, client.Player.Direction, ref blockX, ref blockY);
                                    Messenger.PlayerWarp(client, map, blockX, blockY);
                                }
                                Messenger.PlaySoundToMap(setup.AttackerMap.MapID, "magic50.wav");
                            }
                        }
                        break;
                    case 24: { // Blowback Orb
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                int npc = FindNearestNpc(client);
                                IMap map = client.Player.Map;
                                if (IsPathClear(client, npc)) {
                                    client.Player.TakeItem(181, 1);
                                    Messenger.MapMsg(map.MapID, "An enemy was blown back!", Text.BrightCyan);
                                    int x = 0;
                                    int y = 0;
                                    FindNearestBlock(setup.AttackerMap, client.Player.Direction, ref x, ref y);
                                    MapNpc activeNpc = map.ActiveNpc[npc];
                                    activeNpc.X = x;
                                    activeNpc.Y = y;
                                    int npc2 = FindNearestNpc(client);
                                    if (npc2 != npc) {
                                        MapNpc activeNpc2 = map.ActiveNpc[npc2];
                                        if (activeNpc.X == activeNpc2.X) {
                                            if (activeNpc.Y > activeNpc2.Y) {
                                                activeNpc.Y = activeNpc2.Y - 1;
                                            } else {
                                                activeNpc.Y = activeNpc2.Y + 1;
                                            }
                                        } else {
                                            if (activeNpc.X > activeNpc2.X) {
                                                activeNpc.X = activeNpc2.X - 1;
                                            } else {
                                                activeNpc.X = activeNpc2.X + 1;
                                            }
                                        }
                                        //BattleProcessor.PlayerAttackNpc(client, npc2, 15);
                                    }
                                    //BattleProcessor.PlayerAttackNpc(client, npc, 15);
                                    // SendMapNpc
                                } else {
                                    Messenger.PlayerMsg(client, "It had no effect!", Text.BrightRed);
                                }
                                Messenger.PlaySoundToMap(setup.AttackerMap.MapID, "magic50.wav");
                            }
                        }
                        break;

                    case 25: {//Two-Edge Orb
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                client.Player.TakeItemSlot(invNum, 1, true);
                                IMap map = client.Player.Map;
                                for (int j = 0; j <= 14; j++) {
                                    if (map.ActiveNpc[j].Num > 0) {
                                        if (setup.Attacker.Level >= map.ActiveNpc[j].Level) {
                                            map.ActiveNpc[j].HP = 1;
                                        }
                                        map.ActiveNpc[j].Target = client;
                                    }
                                }

                                Messenger.BattleMsg(client, "All weaker foes in the room are now close to fainting!", Text.BrightRed);
                                //DamagePlayer(client, (setup.Attacker.HP / 2), Enums.KillType.Npc);
                                Messenger.PlaySoundToMap(setup.AttackerMap.MapID, "magic54.wav");
                            }
                        }
                        break;

                    case 26: {//White Flute ~adjust for NPC levels (still unfinished)
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                Messenger.BattleMsg(client, "You used the White Flute!", Text.White);
                                //Messenger.SpellAnim(498, setup.AttackerMap, client.Player.X, client.Player.Y);
                                Messenger.PlaySoundToMap(setup.AttackerMap.MapID, "magic52.wav");
                                IMap map = client.Player.Map;
                                for (int j = 0; j <= 14; j++) {
                                    //if (CheckPlayerRange(index, j, 5, Enums.TargetType.Npc) == true && CheckTarget(index, j, Enums.TargetType.Npc) == true) {
                                    map.ActiveNpc[j].Target = client;
                                    //}
                                }
                                Messenger.BattleMsg(client, "Other Pokémon were lured.", Text.White);
                            }
                        }
                        break;

                    case 27: {//Black Flute
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                Messenger.BattleMsg(client, "You used the Black Flute!", Text.White);
                                //Messenger.SpellAnim(498, setup.AttackerMap, client.Player.X, client.Player.Y);
                                Messenger.PlaySoundToMap(setup.AttackerMap.MapID, "magic52.wav");
                                IMap map = client.Player.Map;
                                for (int j = 0; j <= 14; j++) {
                                    //if (CheckPlayerRange(index, j, 5, Enums.TargetType.Npc) == true && CheckTarget(index, j, Enums.TargetType.Npc) == true && ObjectFactory.GetMapNpc(setup.AttackerMap, j).Target == index) {
                                    map.ActiveNpc[j].Target = null;
                                    //}
                                }
                                Messenger.BattleMsg(client, "Other Pokémon were repelled.", Text.White);
                            }
                        }
                        break;
                    case 28: {//trawl orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("Magic322.wav"), setup.Attacker.X, setup.Attacker.Y, 50);
                            if (setup.AttackerMap.MapType == Enums.MapType.RDungeonMap) {

                                for (int i = 0; i < Server.Constants.MAX_MAP_ITEMS; i++) {
                                    if (setup.AttackerMap.ActiveItem[i].Num != 0 && !setup.AttackerMap.ActiveItem[i].Hidden
                                        && setup.AttackerMap.Tile[setup.AttackerMap.ActiveItem[i].X, setup.AttackerMap.ActiveItem[i].Y].Type != Enums.TileType.DropShop) {
                                        int x = Server.Math.Rand(setup.Attacker.X-1, setup.Attacker.X+2);
                                        int y = Server.Math.Rand(setup.Attacker.Y-1, setup.Attacker.Y+2);
                                        if (x < 0) x = 0;
                                        if (x >= setup.AttackerMap.MaxX) x = setup.AttackerMap.MaxX-1;
                                        if (y < 0) y = 0;
                                        if (y >= setup.AttackerMap.MaxY) y = setup.AttackerMap.MaxY-1;
                                        setup.AttackerMap.SpawnItemSlot(i, setup.AttackerMap.ActiveItem[i].Num, setup.AttackerMap.ActiveItem[i].Value,
                                        setup.AttackerMap.ActiveItem[i].Sticky, false, setup.AttackerMap.ActiveItem[i].Tag, x, y, null);
                                    }
                                }
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("Items were pulled close to "+setup.Attacker.Name+"!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("Items can only be pulled in Mystery Dungeons!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 29: {
                            //Quick Seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            //if ((int)client.Player.SpeedLimit < 6) {
                            //client.Player.SpeedLimit++;
                            //Messenger.SendSpeedLimit(client);
                            //    if (setup.Attacker.VolatileStatus.GetStatus("MovementSpeed") != null) {
                            //        AddExtraStatus(setup.Attacker, setup.AttackerMap, "MovementSpeed", setup.Attacker.VolatileStatus.GetStatus("MovementSpeed").Counter + 1, null, setup.PacketStack);
                            //    } else {
                            //        AddExtraStatus(setup.Attacker, setup.AttackerMap, "MovementSpeed", 1, null, setup.PacketStack);
                            //    }
                            //} else {
                            //    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " can't go any faster!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            //}
                            status = setup.Attacker.VolatileStatus.GetStatus("MovementSpeed");
                            if (status != null) {
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "MovementSpeed", status.Counter + 1, null, "", setup.PacketStack);
                            } else {
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "MovementSpeed", 1, null, "", setup.PacketStack);
                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 30: {
                            //Violent Seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            //StrBuff(index, 2, 0);
                            //PPBuff(index, 2, 0);
                            // TODO: Violent Seed [Scripts]
                        }
                        break;
                    case 31: {
                            //Bad EGG
                        }
                        break;
                    case 32: {//seaside key
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {

                                Client client = ((Recruit)setup.Attacker).Owner;
                                IMap map = client.Player.Map;
                            if (map.Tile[client.Player.X, client.Player.Y].Type == Enums.TileType.RDungeonGoal) {
                                map.Tile[client.Player.X, client.Player.Y].Mask2Set = 4;
                                map.Tile[client.Player.X, client.Player.Y].Mask2 = 2;
                                map.Tile[client.Player.X, client.Player.Y].Data1 = 1;
                                map.TempChange = true;
                                setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateTilePacket(client.Player.X, client.Player.Y, map));
                                setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateBattleMsg("The passage to the next floor was opened!", Text.BrightGreen), client.Player.X, client.Player.Y, 50);
                                setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("Magic127.wav"), client.Player.X, client.Player.Y, 50);
                                setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateBattleDivider(), client.Player.X, client.Player.Y, 50);
                                TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            }
                            }
                        }
                        break;
                    case 33: {//Teru-Sama
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                client.Player.TakeItemSlot(invNum, 1, true);
                                client.CloseConnection();
                            }
                        }
                        break;

                    case 34: {// Lottery Ticket
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                if (DateTime.Now.DayOfWeek == Lottery.LOTTERY_DAY) {
                                    IMap map = client.Player.Map;
                                    if (map.Tile[client.Player.X, client.Player.Y].Type == Enums.TileType.ScriptedSign
                                        && map.Tile[client.Player.X, client.Player.Y].Data1 == 5) {
                                        // Do nothing...
                                    } else {
                                        Messenger.PlayerMsg(client, "Today is " + Lottery.LOTTERY_DAY.ToString() + "! Go to Felicity to see if you won!", Text.Grey);
                                    }
                                } else {
                                    Messenger.PlayerMsg(client, "Talk to Felicity on " + Lottery.LOTTERY_DAY.ToString() + " to see if you won!", Text.Grey);
                                }
                            }
                        }
                        break;

                    case 35: {
                            //Attack Items
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            //setup.SetupMove(MoveManager.Moves[ItemManager.Items[itemNum].Data2].MoveNum]);
                            //setup.Move.Name = setup.Attacker.Name + " used the " + ItemManager.Items[itemNum].Name + "!";
                            setup.moveSlot = -1;
                            setup.moveIndex = ItemManager.Items[itemNum].Data2;
                            BattleProcessor.HandleAttack(setup);
                            if (ItemManager.Items[itemNum].Data3 > 0) {
                                HealCharacterBelly(setup.Attacker, ItemManager.Items[itemNum].Data3, setup.PacketStack);
                            }
                        }
                        break;
                    case 36: {
                            //Gummi
                            // TODO: Type of Gummi is based on data2
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            //if (NetScript.GetPlayerClass(index) == 2 || NetScript.GetPlayerClass(index) == 6 || NetScript.GetPlayerClass(index) == 10) {
                            //    NetScript.SetPlayerMP(index, NetScript.GetPlayerMP(index) + 500);
                            //    NetScript.SetPlayerHP(index, NetScript.GetPlayerHP(index) + 500);
                            //} else {
                            //    NetScript.SetPlayerMP(index, NetScript.GetPlayerMP(index) + 50);
                            //    NetScript.SetPlayerHP(index, NetScript.GetPlayerHP(index) + 50);
                            //}
                        }
                        break;
                    case 37: {//Tasty Honey
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " used the Tasty Honey!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (setup.AttackerMap.Moral != Enums.MapMoral.Safe && setup.AttackerMap.Moral != Enums.MapMoral.House) {
                                for (int i = 0; i <  Constants.MAX_MAP_NPCS / 4; i++) {
                                    setup.AttackerMap.SpawnNpc();
                                }
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("Pokémon were attracted to the scent!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("Pokémon can't be lured in this area!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                        }
                        break;
                    case 38: {
                            //Grimy Food
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            int rand = Server.Math.Rand(0, 1000);
                            //if (setup.AttackerMap.Name == "Spinda's Cafe") rand = 0;
                            if (rand > 750 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Burn.ToString(), false, setup.PacketStack)) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Burn, 0, setup.PacketStack);
                            } else if (rand > 500 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Paralyze.ToString(), false, setup.PacketStack)) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Paralyze, 0, setup.PacketStack);
                            } else if (rand > 250 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Poison.ToString(), false, setup.PacketStack)) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Poison, 1, setup.PacketStack);
                            } else if (rand > 0) {
                                ChangeAttackBuff(setup.Attacker, setup.AttackerMap, -3, setup.PacketStack);
                                ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, -3, setup.PacketStack);
                            } else {
                                rand = Server.Math.Rand(0, 1000);
                                //if (setup.AttackerMap.Name == "Spinda's Cafe") rand = 0;
                                if (rand > 0) {
                                ChangeAttackBuff(setup.Attacker, setup.AttackerMap, -3, setup.PacketStack);
                                ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, -3, setup.PacketStack);
                                } else {
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, Int32.MaxValue, Enums.KillType.Other, setup.PacketStack, true);
                                }
                            }
                            HealCharacterBelly(setup.Attacker, 30, setup.PacketStack);
                        }
                        break;
                    case 39: {
                            //Grimy Berry
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            int rand = Server.Math.Rand(0, 14);
                            switch (rand) {
                                case 0: {
                                        ChangeAttackBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 1: {
                                        ChangeDefenseBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 2: {
                                        ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 3: {
                                        ChangeSpDefBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 4: {
                                        ChangeAccuracyBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 5: {
                                        ChangeEvasionBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                    }
                                    break;
                                case 6: {
                                        ChangeSpeedBuff(setup.Attacker, setup.AttackerMap, -1, setup.PacketStack);
                                    }
                                    break;
                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 40: {
                            //Attack Items Infinite Use

                            //setup.SetupMove(MoveManager.Moves[ItemManager.Items[itemNum].Data2].MoveNum]);
                            //setup.Move.Name = setup.Attacker.Name + " used the " + ItemManager.Items[itemNum].Name + "!";
                            setup.moveSlot = -1;
                            setup.moveIndex = ItemManager.Items[itemNum].Data2;
                            BattleProcessor.HandleAttack(setup);
                            HealCharacterBelly(setup.Attacker, ItemManager.Items[itemNum].Data3, setup.PacketStack);
                        }
                        break;
                    case 41: {//Musical Items
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                for (int i = client.Player.X - 3; i <= client.Player.X + 3; i++) {
                                    for (int j = client.Player.Y - 3; j <= client.Player.Y + 3; j++) {
                                        if (i < 0 || j < 0 || i > client.Player.Map.MaxX || j > client.Player.Map.MaxY) {

                                        } else {
                                            setup.PacketStack.AddPacketToMap(client.Player.Map, PacketBuilder.CreateSpellAnim(498, i, j));
                                        }
                                    }
                                }

                                string musicName = "";

                                switch (ItemManager.Items[itemNum].Data2) {
                                    case 1: {
                                            musicName = "PMD2) Northern Desert.ogg";
                                        }
                                        break;
                                    case 2: {
                                            musicName = "PMD2) Dark Crater.ogg";
                                        }
                                        break;
                                    case 3: {
                                            musicName = "PMD2) Sky Peak Snowfield.ogg";
                                        }
                                        break;
                                    case 4: {
                                            musicName = "PMD2) Miracle Sea.ogg";
                                        }
                                        break;
                                    case 5: {
                                            musicName = "PMD2) Concealed Ruins.ogg";
                                        }
                                        break;
                                    case 6: {
                                            musicName = "PMD2) Sky Peak Forest.ogg";
                                        }
                                        break;
                                    case 7: {
                                            musicName = "PMD) Sky Tower.ogg";
                                        }
                                        break;
                                    case 8: {
                                            musicName = "PMD2) Star Cave.ogg";
                                        }
                                        break;
                                    default: {
                                            musicName = "RBY) Lavender Town.ogg";
                                        }
                                        break;

                                }
                                TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 3, client.Player.Map, null, client.Player.X, client.Player.Y, Enums.Direction.Up, true, true, true);
                                for (int i = 0; i < targets.Count; i++) {
                                    if (targets[i].CharacterType == Enums.CharacterType.Recruit) {
                                        Messenger.PlayMusic(((Recruit)targets[i]).Owner, musicName);
                                    }
                                }
                            }
                        }
                        break;
                    case 42: {
                            //traps
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic105.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                            bool trapPlaced = false;
                            if (setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Scripted && GetTrapType(setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Data1) != null) {
                                    //remove preexisting trap
                                    RemoveTrap(setup.AttackerMap, setup.Attacker.X, setup.Attacker.Y, setup.PacketStack);
                                }

                                if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Walkable) {
                                    //set the trap on a walkable tile
                                    Tile tile = setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y];
                                    tile.Type = Enums.TileType.Scripted;
                                    tile.Data1 = ItemManager.Items[itemNum].Data2;
                                    tile.Data2 = 0;
                                    tile.Data3 = 2;
                                    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                        tile.String1 = ((Recruit)setup.Attacker).Owner.Player.CharID;
                                        tile.String2 = ((Recruit)setup.Attacker).Owner.Player.GuildName;
                                    } else {
                                        tile.String1 = "";
                                        tile.String2 = "";
                                    }
                                    tile.String2 = ItemManager.Items[itemNum].Data3.ToString();
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " placed a trap!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                    trapPlaced = true;
                                }
                            }

                            if (!trapPlaced) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("A trap can't be placed here!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                        }
                        break;
                    case 43: {//Tanren Key
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {

                                Client client = ((Recruit)setup.Attacker).Owner;
                                IMap map = client.Player.Map;
                                TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                /*
                                string param1 = map.Tile[client.Player.X, client.Player.Y].String1;
                                string param2 = map.Tile[client.Player.X, client.Player.Y].String2;
                                string param3 = map.Tile[client.Player.X, client.Player.Y].String3;
                                if (client.Player.PartyID == null) {
                                    TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                    client.Player.WarpToRDungeon(param1.ToInt()-1, ((RDungeonMap)client.Player.Map).RDungeonFloor + 1);

                                } else {
                                    bool warp = true;
                                    Party party = PartyManager.FindPlayerParty(client);
                                    IMap sourceMap = client.Player.Map;
                                    foreach (Client member in party.GetOnlineMemberClients()) {
                                        if (!member.Player.Dead && member.Player.MapID == client.Player.MapID && (member.Player.X != client.Player.X || member.Player.Y != client.Player.Y)) {
                                            warp = false;
                                        }
                                    }

                                    if (warp) {
                                        TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                        foreach (Client member in party.GetOnlineMemberClients()) {
                                            if (member.Player.Map != sourceMap) continue;
                                            member.Player.WarpToRDungeon(param1.ToInt()-1, ((RDungeonMap)member.Player.Map).RDungeonFloor + 1);

                                        }
                                    } else {
                                        setup.PacketStack.AddPacket(client, PacketBuilder.CreateChatMsg("All surviving players on the floor must be on the goal in order to continue.", Text.WhiteSmoke));
                                    }
                                }
                              */
                            if (map.Tile[client.Player.X, client.Player.Y].Type == Enums.TileType.Scripted && map.Tile[client.Player.X, client.Player.Y].Data1 == 68) {
                                map.Tile[client.Player.X, client.Player.Y].Mask2Set = 4;
                                map.Tile[client.Player.X, client.Player.Y].Mask2 = 2;
                                map.Tile[client.Player.X, client.Player.Y].Data1 = 69;
                                map.Tile[client.Player.X, client.Player.Y].String2 = "";
                                map.TempChange = true;
                                setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateTilePacket(client.Player.X, client.Player.Y, map));
                                setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateBattleMsg("A secret passage was opened!", Text.BrightGreen), client.Player.X, client.Player.Y, 50);
                                setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("Magic127.wav"), client.Player.X, client.Player.Y, 50);
                                setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateBattleDivider(), client.Player.X, client.Player.Y, 50);
                                TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            }

                            }
                        }
                        break;
                    case 44: {
                            //Gracidea
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.Attacker.Species == 492 && setup.Attacker.Form == 0) {
                                setup.Attacker.PermanentForm = 1;
                                setup.Attacker.Form = 1;
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("Magic838.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(502, setup.Attacker.X, setup.Attacker.Y));
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " changed forme!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                                RefreshCharacterTraits(setup.Attacker, setup.AttackerMap, setup.PacketStack);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened.", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 45: {
                            //Ragecandybar
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            HealCharacterBelly(setup.Attacker, 30, setup.PacketStack);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(500, setup.Attacker.X, setup.Attacker.Y));
                            TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 3, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, false, true, false);
                            if (targets.Friends.Count > 0) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " shared some pieces with the others!", Text.Pink), setup.Attacker.X, setup.Attacker.Y, 10);
                            for (int i = 0; i < targets.Friends.Count; i++) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(Server.Moves.MoveManager.Moves[500].TravelingAnim, setup.Attacker.X, setup.Attacker.Y, targets.Friends[i].X - setup.Attacker.X, targets.Friends[i].Y - setup.Attacker.Y, 0));
                                HealCharacterBelly(targets.Friends[i], 30, setup.PacketStack);
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(504, targets.Friends[i].X, targets.Friends[i].Y));
                            }
                            }

                        }
                        break;
                    case 46: {//scanner orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("Magic322.wav"), setup.Attacker.X, setup.Attacker.Y, 50);
                            for (int i = 0; i < Server.Constants.MAX_MAP_ITEMS; i++) {
                                if (setup.AttackerMap.ActiveItem[i].Num != 0 && setup.AttackerMap.ActiveItem[i].Hidden) {
                                    setup.AttackerMap.SpawnItemSlot(i, setup.AttackerMap.ActiveItem[i].Num, setup.AttackerMap.ActiveItem[i].Value,
                                    setup.AttackerMap.ActiveItem[i].Sticky, false, setup.AttackerMap.ActiveItem[i].Tag,
                                    setup.AttackerMap.ActiveItem[i].X, setup.AttackerMap.ActiveItem[i].Y, null);
                                }
                            }
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("All hidden items on the floor were revealed!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);

                        }
                        break;
                    case 47: {
                            //Lava Cookie
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            HealCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP, setup.PacketStack);
                            if (setup.Attacker.StatusAilment != Enums.StatusAilment.OK) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, null);
                                //Messenger.BattleMsg(client, "You are no longer poisoned!", Text.White);
                            } else {

                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 48: {
                            //Energy Root
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            HealCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP, setup.PacketStack);
                            HealCharacterPP(setup.Attacker, setup.AttackerMap, 100, setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 200, setup.PacketStack);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "Nausea", 0, null, "", setup.PacketStack);

                        }
                        break;
                    case 49: {
                            //Slowpoketail
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            HealCharacterBelly(setup.Attacker, 60, setup.PacketStack);
                            TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Floor, 0, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, true, false, false);

                            for (int i = 0; i < targets.Count; i++) {
                                if (targets[i].Species == 79 || targets[i].Species == 80 || targets[i].Species == 199) {
                                    AddExtraStatus(targets[i], setup.AttackerMap, "Grudge", 0, null, "", setup.PacketStack);
                                }
                            }

                        }
                        break;
                    case 53: {
                            //Wonder Gummi
                            // TODO: Wonder Gummi
                            ////if (NetScript.GetPlayerClass(index) == 2 || NetScript.GetPlayerClass(index) == 6 || NetScript.GetPlayerClass(index) == 10) {
                            //client.Player.TakeItem(520, 1);
                            //NetScript.SetPlayerMP(index, NetScript.GetPlayerMP(index) + 500);
                            //NetScript.SetPlayerHP(index, NetScript.GetPlayerHP(index) + 500);
                            ////}
                        }
                        break;
                    case 55: {
                            //Old Gateau
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.Attacker.StatusAilment != Enums.StatusAilment.OK) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, null);
                                //Messenger.BattleMsg(client, "You are no longer poisoned!", Text.White);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened.", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                            HealCharacterBelly(setup.Attacker, 30, setup.PacketStack);
                        }
                        break;
                    case 56: {//for west wing
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                if (client.Player.Direction == Enums.Direction.Up && setup.AttackerMap.MapID == MapManager.GenerateMapID(743) && client.Player.X == 11) {
                                    Messenger.AskQuestion(client, "AbandonedMansion", "Will you use the West Wing Key to enter?", -1);
                                } else {
                                    StoryManager.PlayStory(client, 298);
                                }
                            }
                        }
                        break;
                    case 57: {//for east wing
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                if (client.Player.Direction == Enums.Direction.Up && setup.AttackerMap.MapID == MapManager.GenerateMapID(743) && client.Player.X == 21) {
                                    Messenger.AskQuestion(client, "AbandonedMansion", "Will you use the East Wing Key to enter?", -1);
                                } else {
                                    StoryManager.PlayStory(client, 298);
                                }
                            }
                        }
                        break;
                    case 58: {//for abandoned mansion
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                if (client.Player.Direction == Enums.Direction.Up && setup.AttackerMap.MapID == MapManager.GenerateMapID(743) && client.Player.X == 16) {
                                    Messenger.AskQuestion(client, "AbandonedMansion", "Will you use the Mansion Key to enter?", -1);
                                } else {
                                    StoryManager.PlayStory(client, 298);
                                }
                            }
                        }
                        break;
                    case 59: {//One-Room Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.AttackerMap.MapType == Enums.MapType.RDungeonMap) {
                                RDungeonMap map = (RDungeonMap)setup.AttackerMap;
                                int[,] intArray = new int[map.MaxX + 1, map.MaxY + 1];
                                for (int x = 0; x <= map.MaxX; x++) {
                                    for (int y = 0; y <= map.MaxY; y++) {
                                        if (x == 0 || y == 0 || x == map.MaxX || y == map.MaxY) {
                                            map.Tile[x, y].RDungeonMapValue = 1;
                                            RDungeonFloorGen.AmbiguateTile(map.Tile[x, y]);
                                        } else if (map.Tile[x, y].RDungeonMapValue == 4 || map.Tile[x, y].RDungeonMapValue == 5 || map.Tile[x, y].RDungeonMapValue >= 256 && map.Tile[x, y].RDungeonMapValue < 512) {
                                            map.Tile[x, y].RDungeonMapValue = 3;
                                            RDungeonFloorGen.AmbiguateTile(map.Tile[x, y]);
                                        }
                                        intArray[x, y] = map.Tile[x, y].RDungeonMapValue;
                                    }
                                }
                                DungeonArrayFloor.TextureDungeon(intArray);

                                for (int x = 0; x <= map.MaxX; x++) {
                                    for (int y = 0; y <= map.MaxY; y++) {
                                        map.Tile[x, y].RDungeonMapValue = intArray[x, y];
                                    }
                                }

                                RDungeonFloorGen.TextureDungeonMap(map);

                                for (int x = 0; x <= map.MaxX; x++) {
                                    for (int y = 0; y <= map.MaxY; y++) {
                                        setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateTilePacket(x, y, map));
                                    }
                                }
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The walls crumbled, forming one big room!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic174.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 60: {//Drought Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.AttackerMap.MapType == Enums.MapType.RDungeonMap) {
                                RDungeonMap map = (RDungeonMap)setup.AttackerMap;
                                int[,] intArray = new int[map.MaxX + 1, map.MaxY + 1];
                                for (int x = 0; x <= map.MaxX; x++) {
                                    for (int y = 0; y <= map.MaxY; y++) {
                                        if (map.Tile[x, y].RDungeonMapValue >= 512 && map.Tile[x, y].RDungeonMapValue < 768) {
                                            map.Tile[x, y].RDungeonMapValue = 3;
                                            RDungeonFloorGen.AmbiguateTile(map.Tile[x, y]);
                                        }
                                        intArray[x, y] = map.Tile[x, y].RDungeonMapValue;
                                    }
                                }

                                DungeonArrayFloor.TextureDungeon(intArray);

                                for (int x = 0; x <= map.MaxX; x++) {
                                    for (int y = 0; y <= map.MaxY; y++) {
                                        map.Tile[x, y].RDungeonMapValue = intArray[x, y];
                                    }
                                }

                                RDungeonFloorGen.TextureDungeonMap(map);

                                for (int x = 0; x <= map.MaxX; x++) {
                                    for (int y = 0; y <= map.MaxY; y++) {
                                        setup.PacketStack.AddPacketToMap(map, PacketBuilder.CreateTilePacket(x, y, map));
                                    }
                                }
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("All liquids were drained from the floor!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic170.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                        }
                        break;
                    case 61: {
                            //heal seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.Attacker.StatusAilment != Enums.StatusAilment.OK) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                                //Messenger.BattleMsg(client, "You are no longer poisoned!", Text.White);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened.", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 69: {
                            //blinker seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "Blind", 20, null, "", setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 70: {//Weather Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                if (Server.Math.Rand(0, 10) == 0) {
                                    SetMapWeather(setup.AttackerMap, (Enums.Weather)ItemManager.Items[itemNum].Data3, setup.PacketStack);
                                } else {
                                    SetMapWeather(setup.AttackerMap, (Enums.Weather)ItemManager.Items[itemNum].Data2, setup.PacketStack);
                                }
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The weather can only change in dungeons and arenas!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                        }
                        break;
                    case 71: {//Recycle Orb
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                bool grimy = false;
                                for (int i = 1; i <= client.Player.Inventory.Count; i++) {
                                    if (client.Player.Inventory[i].Num != 74 && client.Player.Inventory[i].Num != 75) {
                                    } else if (client.Player.Inventory[i].Tag.IsNumeric() && client.Player.Inventory[i].Tag.ToInt() > 0) {
                                        int grimyItem = client.Player.Inventory[i].Num;
                                        client.Player.Inventory[i].Num = client.Player.Inventory[i].Tag.ToInt();
                                        client.Player.Inventory[i].Tag = "";
                                    } else {
                                        grimy = true;
                                    }
                                    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                        PacketBuilder.AppendInventory(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                                    }
                                }
                                Messenger.PlayerMsg(client, "Grimy items in the bag have been restored!", Text.Cyan);
                                Messenger.PlayerMsg(client, "But some items were too grimy to recycle...", Text.Blue);
                            }
                        }
                        break;
                    case 72: {//heart slate
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                int slot = -1;
                                for (int i = 1; i <= client.Player.Inventory.Count; i++) {
                                    if (client.Player.Inventory[i].Num == 171 && !client.Player.Inventory[i].Tag.Contains(item.Tag)) {
                                        slot = i;
                                        break;
                                    }
                                }
                                if (slot > -1) {
                                    client.Player.Inventory[slot].Tag += (item.Tag + ";");
                                    TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                    Messenger.PlayerMsg(client, "The item disappeared, and its symbol was imprinted into the Mystery Part!", Text.Cyan);
                                    Messenger.PlaySoundToMap(client.Player.MapID, "magic765.wav");
                                } else {
                                    Messenger.PlayerMsg(client, "But nothing happened...", Text.Blue);
                                }

                            }
                        }
                        break;
                    case 73: {//mystery part
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                string[] choicesNum = item.Tag.Split(';');
                                if (choicesNum.Length > 1 && IsHardModeEntrance(setup.AttackerMap)) {
                                    List<string> choices = new List<string>();
                                    bool tooMany = false;
                                    for (int i = 0; i < choicesNum.Length-1; i++) {
                                        if (choices.Count >= 5) {
                                        tooMany = true;
                                            break;
                                        }
                                        choices.Add("#" + choicesNum[i] + ": " + Pokedex.GetPokemon(choicesNum[i].ToInt()).Name);
                                    }
                                    if (tooMany) {
                                        choices.Add("Others");
                                    }
                                    choices.Add("Cancel");

                                    Messenger.AskQuestion(client, "SummonGuardian:0:" + item.Tag, "Which ally will you call forth?", -1, choices.ToArray());
                                } else {
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened...", Text.Blue), setup.Attacker.X, setup.Attacker.Y, 10);
                                }
                            }
                        }
                        break;
                    case 74: {//Luminous Orb
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic322.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                                if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                                    AddMapStatus(setup.AttackerMap, "Luminous", 0, "", -1, setup.PacketStack);
                                } else {
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The map can only be lit up in dungeons and arenas!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                }
                            }
                        }
                        break;
                    case 75: {
                            //Vanish seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "Invisible", 20, null, "", setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 76: {//Cleanse Orb
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                Client client = ((Recruit)setup.Attacker).Owner;
                                TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                                for (int i = 1; i <= client.Player.Inventory.Count; i++) {
                                    if (client.Player.Inventory[i].Sticky) {
                                        client.Player.SetItemSticky(i, false);
                                    }
                                }
                                Messenger.PlayerMsg(client, "All sticky items have been cleansed!", Text.Cyan);
                            }
                        }
                        break;
                    case 77: {
                            //Pinch Berry
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            // if (setup.Attacker.HP <= setup.Attacker.MaxHP / 2) {
                            int raisedStat = ItemManager.Items[itemNum].Data2;
                            if (raisedStat == -1) {
                                raisedStat = Server.Math.Rand(0, 7);
                            }
                            switch (raisedStat) {
                                case 0: {
                                        ChangeAttackBuff(setup.Attacker, setup.AttackerMap, 20, setup.PacketStack);
                                    }
                                    break;
                                case 1: {
                                        ChangeDefenseBuff(setup.Attacker, setup.AttackerMap, 20, setup.PacketStack);
                                    }
                                    break;
                                case 2: {
                                        ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, 20, setup.PacketStack);
                                    }
                                    break;
                                case 3: {
                                        ChangeSpDefBuff(setup.Attacker, setup.AttackerMap, 20, setup.PacketStack);
                                    }
                                    break;
                                case 4: {
                                        ChangeSpeedBuff(setup.Attacker, setup.AttackerMap, 20, setup.PacketStack);
                                    }
                                    break;
                                case 5: {
                                        ChangeAccuracyBuff(setup.Attacker, setup.AttackerMap, 20, setup.PacketStack);
                                    }
                                    break;
                                case 6: {
                                        ChangeEvasionBuff(setup.Attacker, setup.AttackerMap, 20, setup.PacketStack);
                                    }
                                    break;
                            }
                            //} else {
                            //    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened.", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            //}
                            //HealCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP / 2, setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 78: {
                            //Persim Berry
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);

                            if (setup.Attacker.VolatileStatus.GetStatus("Confusion") != null) {
                                RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Confusion", setup.PacketStack);
                            } else {
                                //setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Confusion Guard", 10, null, "", setup.PacketStack);
                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 79: {
                            //Lum Berry
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.Attacker.StatusAilment != Enums.StatusAilment.OK) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                                //Messenger.BattleMsg(client, "You are no longer poisoned!", Text.White);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But nothing happened.", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                            }
                            for (int i = setup.Attacker.VolatileStatus.Count - 1; i > -1; i--) {
                                if (IsStatusBad(setup.Attacker.VolatileStatus[i].Name)) {
                                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, setup.Attacker.VolatileStatus[i].Name, setup.PacketStack);
                                }
                            }
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 80: {
                            //Type-reduce Berry
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "TypeReduce", ItemManager.Items[itemNum].Data2, null, "", setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 81: {
                            //Trap-See Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            for (int x = 0; x <= setup.AttackerMap.MaxX; x++) {
                                for (int y = 0; y <= setup.AttackerMap.MaxY; y++) {
                                    if (setup.AttackerMap.Tile[x, y].Type == Enums.TileType.Scripted && GetTrapType(setup.AttackerMap.Tile[x, y].Data1) != null && GetTrapType(setup.AttackerMap.Tile[x, y].Data1) != "SecretRoom") {
                                        RevealTrap(setup.AttackerMap, x, y, setup.PacketStack);
                                    }
                                }
                            }
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("All traps on the floor were exposed!", Text.Pink));
                        }
                        break;
                    case 82: {
                            //Trapbust Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            for (int x = 0; x <= setup.AttackerMap.MaxX; x++) {
                                for (int y = 0; y <= setup.AttackerMap.MaxY; y++) {
                                    if (setup.AttackerMap.Tile[x, y].Type == Enums.TileType.Scripted && GetTrapType(setup.AttackerMap.Tile[x, y].Data1) != null && GetTrapType(setup.AttackerMap.Tile[x, y].Data1) != "SecretRoom") {
                                        RemoveTrap(setup.AttackerMap, x, y, setup.PacketStack);
                                    }
                                }
                            }
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("All traps on the floor were destroyed!", Text.Pink));
                        }
                        break;
                    case 83: {//White Herb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            RemoveBuffs(setup.Attacker);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s stats were returned to normal!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);

                            HealCharacterBelly(setup.Attacker, 3, setup.PacketStack);
                        }
                        break;
                    case 84: {//Evasion Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            ChangeEvasionBuff(setup.Attacker, setup.AttackerMap, 2, setup.PacketStack);

                        }
                        break;
                    case 85: {
                            //Slip Seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "Slip", 0, null, "", setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 86: {
                            //Mobile Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "SuperMobile", 0, null, "", setup.PacketStack);
                        }
                        break;
                    case 87: {//Power Herb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "SuperCharge", 0, null, "", setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 3, setup.PacketStack);
                        }
                        break;
                    case 88: {
                            //Type-boost gem
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "TypeBoost", ItemManager.Items[itemNum].Data2, null, "", setup.PacketStack);
                        }
                        break;
                    case 89: {//Mental Herb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Attract", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Encore", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Torment", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Taunt", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Disable", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "MoveSeal:0", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "MoveSeal:1", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "MoveSeal:2", setup.PacketStack);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "MoveSeal:3", setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 3, setup.PacketStack);
                        }
                        break;
                    case 90: {//revives and max revives
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                ActivateRevivalItem(((Recruit)setup.Attacker).Owner, itemNum);
                            }
                        }
                        break;
                    case 91: {//Pathfinder Orb
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            Client client = ((Recruit)setup.Attacker).Owner;
                            if (setup.AttackerMap.Name != "Pitch-Black Abyss") {
                                Messenger.PlayerMsg(client, "The orb fills with a brilliant light, then fades out.", Text.Cyan);
                            } else {
                                int left, right, up, down;
                                string dir = "";
                                int x = -1;
                                int y = -1;

                                for (int i = 0; i < exPlayer.Get(client).DungeonMaxX; i++) {
                                    for (int j = 0; j < exPlayer.Get(client).DungeonMaxY; j++) {
                                        if (exPlayer.Get(client).DungeonMap[i,j] == PitchBlackAbyss.Room.End) {
                                            x = i;
                                            y = j;
                                        }
                                    }
                                }

                                if (exPlayer.Get(client).DungeonX >= x) {
                                    left = exPlayer.Get(client).DungeonX - x;
                                    right = exPlayer.Get(client).DungeonMaxX - left;
                                } else {
                                    right = x - exPlayer.Get(client).DungeonX;
                                    left = exPlayer.Get(client).DungeonMaxX - right;
                                }
                                if (exPlayer.Get(client).DungeonY >= y) {
                                    up = exPlayer.Get(client).DungeonY - y;
                                    down = exPlayer.Get(client).DungeonMaxY - up;
                                } else {
                                    down = y - exPlayer.Get(client).DungeonY;
                                    up = exPlayer.Get(client).DungeonMaxY - down;
                                }
                                    if (left == 0) {
                                    if (up < down) dir = "North";
                                    else dir = "South";
                                } else if (up == 0) {
                                    if (left < right) dir = "West";
                                    else dir = "East";
                                } else {
                                    //composite cases
                                    if (up < down) dir = "North";
                                    else dir = "South";
                                    if (left < right) dir = dir + "-West";
                                    else dir = dir + "-East";
                                }
                                Messenger.PlayerMsg(client, "The exit is to the " + dir + ".", Text.Cyan);
                            }
                        }
                        break;
                    case 92: { //sleep seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Sleep, Server.Math.Rand(2, 4), setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 93: { //dark liquid
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            HealCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP, setup.PacketStack);
                            HealCharacterPP(setup.Attacker, setup.AttackerMap, 100, setup.PacketStack);
                            HealCharacterBelly(setup.Attacker, 200, setup.PacketStack);
                            //grimy food effect
                            int rand = Server.Math.Rand(0, 1000);
                            if (rand > 750 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Burn.ToString(), false, setup.PacketStack)) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Burn, 0, setup.PacketStack);
                            } else if (rand > 500 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Paralyze.ToString(), false, setup.PacketStack)) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Paralyze, 0, setup.PacketStack);
                            } else if (rand > 250 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Poison.ToString(), false, setup.PacketStack)) {
                                SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Poison, 1, setup.PacketStack);
                            } else if (rand > 0) {
                                ChangeAttackBuff(setup.Attacker, setup.AttackerMap, -3, setup.PacketStack);
                                ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, -3, setup.PacketStack);
                            } else {
                                rand = Server.Math.Rand(0, 1000);
                                if (rand > 0) {
                                ChangeAttackBuff(setup.Attacker, setup.AttackerMap, -3, setup.PacketStack);
                                ChangeSpAtkBuff(setup.Attacker, setup.AttackerMap, -3, setup.PacketStack);
                                } else {
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, Int32.MaxValue, Enums.KillType.Other, setup.PacketStack, true);
                                }
                            }
                        }
                        break;
                    case 94: {
                            //jaboca/rowap Berry
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            // if (setup.Attacker.HP <= setup.Attacker.MaxHP / 2) {

                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "AttackReturn", ItemManager.Items[itemNum].Data2, null, "", setup.PacketStack);

                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 95: {
                            //lansat Berry
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            // if (setup.Attacker.HP <= setup.Attacker.MaxHP / 2) {

                            AddExtraStatus(setup.Attacker, setup.AttackerMap, "FocusEnergy", 8, null, "", setup.PacketStack);

                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;
                    case 96: {
                            //pure seed
                            TakeItemSlotFromCharacter(setup.Attacker, invNum, 1);
                            if (setup.AttackerMap.MapType == Enums.MapType.RDungeonMap) {
                                WarpToStairs(setup.Attacker, setup.AttackerMap, setup.PacketStack, 5);
                            } else {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("Warping works only Mystery Dungeons!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            }

                            HealCharacterBelly(setup.Attacker, 5, setup.PacketStack);
                        }
                        break;

                }
                //if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                    //Client client = ((Recruit)setup.Attacker).Owner;
                    //Logger.AppendToLog("/Player Event Logs/" + client.Player.Name + ".txt", "Used scripted item: " + ItemManager.Items[itemNum].Name, true);
                //}

            } catch (Exception ex) {
                Messenger.AdminMsg("Error: ScriptedItem " + item.Num + "-" + invNum, Text.Black);

                Messenger.AdminMsg(ex.ToString(), Text.Black);
            }
        }
示例#19
0
        public void UseMove(int moveSlot)
        {
            if (owner.Player.Dead) {
                return;
            }

            owner.Player.Map.ProcessingPaused = false;

            if (Ranks.IsDisallowed(owner, Enums.Rank.Moniter) || owner.Player.ProtectionOff) {
                owner.Player.Hunted = true;
                Messenger.SendHunted(owner);
            }

            if (!Core.GetTickCount().Elapsed(owner.Player.PauseTimer, 0)) {
                return;
            }

            if (moveSlot > -1 && moveSlot < 4) {
                Move move = MoveManager.Moves[Moves[moveSlot].MoveNum];
                IMap currentMap = owner.Player.GetCurrentMap();
                if (move.KeyItem > 0) {
                    bool doorOpened = UseMoveKey(currentMap, move, moveSlot);
                    if (doorOpened) {
                        return;
                    }
                }
            }
            BattleSetup setup = new BattleSetup();
            setup.Attacker = this;
            setup.moveSlot = moveSlot;

            BattleProcessor.HandleAttack(setup);

            BattleProcessor.FinalizeAction(setup);
        }
示例#20
0
文件: Main.cs 项目: MandL27/Server
        public static bool CanUseItem(BattleSetup setup, InventoryItem item)
        {
            try {
                if (setup.Attacker.AttackTimer == null) {
                    setup.Attacker.AttackTimer = new TickCount(Core.GetTickCount().Tick);
                }
                if (setup.Attacker.AttackTimer.Tick > Core.GetTickCount().Tick) {
                    setup.Cancel = true;
                    return false;
                }
                if (setup.Attacker.PauseTimer == null) {
                    setup.Attacker.PauseTimer = new TickCount(Core.GetTickCount().Tick);
                }
                if (setup.Attacker.PauseTimer.Tick > Core.GetTickCount().Tick) {
                    setup.Cancel = true;
                    return false;
                }

                if (item.Sticky) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The " + ItemManager.Items[item.Num].Name + " is all sticky and doesn't work!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.Cancel = true;
                    return false;
                }

                if (setup.Attacker.VolatileStatus.GetStatus("Embargo") != null) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " can't use items due to the Embargo!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.Cancel = true;
                    return false;
                }
                int itemEdibility = CheckItemEdibility(item.Num);
                if (itemEdibility != 0) {
                    TargetCollection checkedTargets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, true, false, false);
                    for (int i = 0; i < checkedTargets.Foes.Count; i++) {
                        if (HasAbility(checkedTargets.Foes[i], "Unnerve")) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is unnerved!  It can't eat anything!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return false;
                        }
                    }

                    if (setup.Attacker.VolatileStatus.GetStatus("Nausea") != null) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is nauseated!  It can't eat anything!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return false;
                    }

                    if (HasAbility(setup.Attacker, "Gluttony") || HasActiveBagItem(setup.Attacker, 40, 0, 0)) {
                        if (itemEdibility == 1) {
                            setup.BattleTags.Add("Gluttony:60");
                        } else if (itemEdibility == 3) {
                            setup.BattleTags.Add("Gluttony:20");
                        }
                    }
                }

                return true;
            } catch (Exception ex) {
                Messenger.AdminMsg("Error: CanUseItem", Text.Black);
                return false;
            }
        }
示例#21
0
        public void UseMoveOnFoes(BattleSetup setup, TargetCollection targets)
        {
            Parties.Party party = null;
            if (owner.Player.IsInParty()) {
                party = Parties.PartyManager.FindPlayerParty(owner);
            }

            //List<ICharacter> targets = MoveProcessor.GetTargetsInRange(setup.Move.RangeType, setup.Move.Range, setup.AttackerMap, this, owner.Player.X, owner.Player.Y, owner.Player.Direction);

            Move move = setup.SetdownMove();

            foreach (ICharacter i in targets.Foes) {
                // Don't attack allies
                if (i.CharacterType == Enums.CharacterType.Recruit) {
                    Recruit recruit = i as Recruit;
                    if (Ranks.IsAllowed(recruit.Owner, Enums.Rank.Moniter) && !recruit.Owner.Player.Hunted
                        || (recruit.Owner.Player.Map.Tile[recruit.Owner.Player.X, recruit.Owner.Player.Y].Type == Enums.TileType.Arena) != (Owner.Player.Map.Tile[X, Y].Type == Enums.TileType.Arena)) {

                    } else {
                        setup.Defender = i;
                        BattleProcessor.MoveHitCharacter(setup);
                        setup.SetupMove(move);
                        if (setup.Cancel) {
                            return;
                        }
                    }
                } else if (i.CharacterType == Enums.CharacterType.MapNpc && (((MapNpc)i).Num <= 0 || ((MapNpc)i).HP <= 0)) {
                } else if (i.CharacterType == Enums.CharacterType.MapNpc) {
                    MapNpc npc = i as MapNpc;
                    if (Npcs.NpcManager.Npcs[npc.Num].Behavior == Enums.NpcBehavior.Scripted) {
                        if (setup.moveIndex == -1) {
                            Scripting.ScriptManager.InvokeSub("ScriptedNpc", setup.Attacker, Npcs.NpcManager.Npcs[npc.Num].AIScript, npc.Num, owner.Player.Map, i);
                        }
                    } else if (!string.IsNullOrEmpty(Npcs.NpcManager.Npcs[npc.Num].AttackSay) && (Npcs.NpcManager.Npcs[npc.Num].Behavior == Enums.NpcBehavior.Friendly || Npcs.NpcManager.Npcs[npc.Num].Behavior == Enums.NpcBehavior.Shopkeeper)) {
                        if (setup.moveIndex == -1) {
                            Stories.Story story = new Stories.Story();
                            Stories.StoryBuilderSegment segment = Stories.StoryBuilder.BuildStory();
                            Stories.StoryBuilder.AppendSaySegment(segment, Npcs.NpcManager.Npcs[npc.Num].Name.Trim() + ": " + Npcs.NpcManager.Npcs[npc.Num].AttackSay.Trim(),
                                Npcs.NpcManager.Npcs[npc.Num].Species, 0, 0);
                            segment.AppendToStory(story);
                            Stories.StoryManager.PlayStory(owner, story);
                        }
                    } else {
                        setup.Defender = i;
                        BattleProcessor.MoveHitCharacter(setup);
                        setup.SetupMove(move);
                        if (setup.Cancel) {
                            return;
                        }
                    }
                } else {
                    setup.Defender = i;
                    BattleProcessor.MoveHitCharacter(setup);
                    setup.SetupMove(move);
                    if (setup.Cancel) {
                        return;
                    }
                }

            }
        }
示例#22
0
文件: Main.cs 项目: MandL27/Server
 public static void ThrewItem(BattleSetup setup, InventoryItem item, int invNum)
 {
     try {
         if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
             setup.PacketStack.AddPacket(((Recruit)setup.Attacker).Owner, PacketBuilder.CreateChatMsg("Throwing items currently in progress.", Text.Black));
         }
     } catch (Exception ex) {
         Messenger.AdminMsg("Error: ThrewItem", Text.Black);
     }
 }
示例#23
0
        public static void AfterMoveUsed(BattleSetup setup)
        {
            try {
                ExtraStatus status;

                //Recharge time
                if (setup.Move.AdditionalEffectData1 == 9 || setup.Move.AdditionalEffectData1 == 128 ||
                    setup.Move.AdditionalEffectData1 == 132) {
                    setup.Attacker.PauseTimer = new TickCount(setup.Attacker.PauseTimer.Tick + 1000);
                } else if (setup.Move.AdditionalEffectData1 == 8) {
                    setup.Attacker.PauseTimer = new TickCount(setup.Attacker.PauseTimer.Tick + setup.Move.AdditionalEffectData2);
                } else {
                    //setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.AttackTimer.Tick.ToString(), Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.Attacker.AttackTimer = new TickCount(setup.Attacker.AttackTimer.Tick + setup.Attacker.TimeMultiplier * setup.Move.HitTime / 1000);
                    //setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.AttackTimer.Tick.ToString(), Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                }

                //for Standard Attacks
                if (setup.moveIndex < 1) {

                    if (setup.BattleTags.Contains("HitSomething")) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic2.wav"));
                        //Messenger.PlaySoundToMap(setup.AttackerMap, "magic2.wav");
                    }
                    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                        //if (((Recruit)setup.Attacker).Owner.Player.WaitingBattleMsg.FindIn
                        int x = setup.Attacker.X;
                        int y = setup.Attacker.Y;
                        MoveInDirection(setup.Attacker.Direction, 1, ref x, ref y);
                        if (x >= 0 && x <= setup.AttackerMap.MaxX && y >= 0 && y <= setup.AttackerMap.MaxY) {
                            Tile tile = setup.AttackerMap.Tile[x, y];
                            if (tile.Type == Enums.TileType.Scripted && GetTrapItem(tile.Data1) > 0 && tile.Data2 > 0) {
                                //if the trap is revealed, destroy it
                                if (setup.Attacker.HasActiveItem(116) && WillTrapActivate(setup.Attacker, setup.AttackerMap, x, y)) {
                                    //spawn item
                                    setup.AttackerMap.SpawnItem(GetTrapItem(tile.Data1), 1, false, false, "", x, y, null);
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("Magic22.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(505, x, y));
                                    //delete trap
                                    RemoveTrap(setup.AttackerMap, x, y, setup.PacketStack);
                                }
                            } else if (tile.Type == Enums.TileType.Scripted && GetTrapType(tile.Data1) != null && tile.Data3 != 1) {
                            //if the trap is hidden, reveal it
                                RevealTrap(setup.AttackerMap, x, y, setup.PacketStack);
                            }

                            for (int i = 0; i < Server.Constants.MAX_MAP_ITEMS; i++) {
                                if (setup.AttackerMap.ActiveItem[i].Num != 0 && setup.AttackerMap.ActiveItem[i].Hidden) {
                                    if (setup.AttackerMap.ActiveItem[i].X == x && setup.AttackerMap.ActiveItem[i].Y == y) {
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(491, x, y));
                                        setup.AttackerMap.SpawnItemSlot(i, setup.AttackerMap.ActiveItem[i].Num, setup.AttackerMap.ActiveItem[i].Value,
                                        setup.AttackerMap.ActiveItem[i].Sticky, false, setup.AttackerMap.ActiveItem[i].Tag,
                                        setup.AttackerMap.ActiveItem[i].X, setup.AttackerMap.ActiveItem[i].Y, null);
                                    }
                                }
                            }
                        }
                    }
                }

                //conversion
                status = setup.Attacker.VolatileStatus.GetStatus("Conversion");
                if (status != null && GetBattleTagArg(setup.BattleTags, "Conversion", 0) == null && setup.Move.Element != Enums.PokemonType.None) {
                    if (setup.Attacker.Type1 != setup.Move.Element) {
                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type1", (int)setup.Move.Element, null, "", setup.PacketStack);
                    }
                    if (setup.Attacker.Type2 != Enums.PokemonType.None) {
                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type2", 0, null, "", setup.PacketStack, false);
                    }
                }

                //trap destruction on Rapid Spin
                if (setup.Move.AdditionalEffectData1 == 85) {
                    bool trapRemoved = false;
                    for (int x = setup.Attacker.X - 1; x <= setup.Attacker.X + 1; x++) {
                        for (int y = setup.Attacker.Y - 1; y <= setup.Attacker.Y + 1; y++) {
                            if (x >= 0 && y >= 0 && x <= setup.AttackerMap.MaxX && y <= setup.AttackerMap.MaxY) {
                                Tile tile = setup.AttackerMap.Tile[x, y];
                                if (tile.Type == Enums.TileType.Scripted && GetTrapType(tile.Data1) != null) {
                                    RemoveTrap(setup.AttackerMap, x, y, setup.PacketStack);
                                    trapRemoved = true;
                                }
                            }
                        }
                    }
                    if (trapRemoved) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("All nearby traps were destroyed!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    }
                }

                //fog clearing and trap destruction on Defog
                if (setup.Move.AdditionalEffectData1 == 86) {
                    if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Arena || setup.AttackerMap.Moral == Enums.MapMoral.None || setup.AttackerMap.Moral == Enums.MapMoral.NoPenalty) {
                        if (setup.AttackerMap.Weather == Enums.Weather.Fog) {
                            setup.AttackerMap.Weather = Enums.Weather.None;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, TcpPacket.CreatePacket("weather", ((int)setup.AttackerMap.Weather).ToString()));
                        }
                    } else {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The weather can only change in dungeons and arenas!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    }
                    bool trapRemoved = false;
                    for (int x = 0; x <= setup.AttackerMap.MaxX; x++) {
                        for (int y = 0; y <= setup.AttackerMap.MaxY; y++) {
                            Tile tile = setup.AttackerMap.Tile[x, y];
                            if (tile.Type == Enums.TileType.Scripted && GetTrapType(tile.Data1) != null && tile.Data2 == 1) {
                                RemoveTrap(setup.AttackerMap, x, y, setup.PacketStack);
                                trapRemoved = true;
                            }
                        }
                    }
                    if (trapRemoved) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("All revealed traps on the floor were destroyed!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    }
                }

                //Final Gambit backlash
                if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Hit && setup.Move.Data1 == 170) {
                    setup.Attacker.HP = 1;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is on the verge of fainting after that last move!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                }

                //Healing Wish backlash
                if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 43) {
                    setup.Attacker.HP = 1;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is on the verge of fainting after that last move!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                }

                //Memento backlash
                if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 89) {
                    setup.Attacker.HP = 1;
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is on the verge of fainting after that last move!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    if (setup.AttackerMap.MapType == Enums.MapType.RDungeonMap) {
                        RandomWarp(setup.Attacker, setup.AttackerMap, true, setup.PacketStack);
                    } else {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " can only warp in mystery dungeons!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    }
                }

                status = setup.Attacker.VolatileStatus.GetStatus("Rampage");
                            if (status != null) {
                                status.Counter--;
                                if (status.Counter <= 0) {
                                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Rampage", setup.PacketStack);
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "Confusion", Server.Math.Rand(5, 11), null, "", setup.PacketStack, true);
                                }
                            }
                            status = setup.Attacker.VolatileStatus.GetStatus("Rolling");
                            if (status != null) {
                                if (setup.BattleTags.Contains("HitSomething")) {

                                    status.Counter++;
                                    if (status.Counter >= 5) {
                                        RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Rolling", setup.PacketStack);
                                    }
                                } else {
                                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Rolling", setup.PacketStack);
                                }
                            }
                            status = setup.Attacker.VolatileStatus.GetStatus("FuryCutter");
                            if (status != null) {
                                if (setup.BattleTags.Contains("HitSomething")) {
                                    if (status.Counter < 5) {
                                        status.Counter++;
                                    }
                                } else {
                                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "FuryCutter", setup.PacketStack);
                                }
                            }

            } catch (Exception ex) {
                Messenger.AdminMsg("Error: AfterMoveUsed", Text.Black);
                Messenger.AdminMsg(ex.ToString(), Text.Black);
                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                    Messenger.AdminMsg("Attacker: " + ((Recruit)setup.Attacker).Owner.Player.Name, Text.Black);
                }
                if (setup.Defender.CharacterType == Enums.CharacterType.Recruit) {
                    Messenger.AdminMsg("Defender: " + ((Recruit)setup.Defender).Owner.Player.Name, Text.Black);
                }

            }
        }
示例#24
0
        public static void OnMapTick(IMap map)
        {
            bool pointReached = false;
            try {

                PacketHitList hitlist = null;
                PacketHitList.MethodStart(ref hitlist);

                MapStatus status;
                if (!map.ProcessingPaused) {
                    status = map.TempStatus.GetStatus("TrickRoom");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveMapStatus(map, "TrickRoom", hitlist);
                        }
                    }
                    status = map.TempStatus.GetStatus("Gravity");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveMapStatus(map, "Gravity", hitlist);
                        }
                    }
                    status = map.TempStatus.GetStatus("WonderRoom");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveMapStatus(map, "WonderRoom", hitlist);
                        }
                    }
                    status = map.TempStatus.GetStatus("MagicRoom");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveMapStatus(map, "MagicRoom", hitlist);
                        }
                    }
                    status = map.TempStatus.GetStatus("Flash");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveMapStatus(map, "Flash", hitlist);
                        }
                    }

                    status = map.TempStatus.GetStatus("Wind");

                    if (status != null) {

                        status.Counter++;
                        if (map.TimeLimit <= 0) {

                        } else if (status.Counter > map.TimeLimit) {
                            int victims = 0;

                            foreach (Client client in map.GetClients()) {
                                if (Ranks.IsDisallowed(client, Enums.Rank.Mapper)) {

                                    HandleGameOver(client, Enums.KillType.Other);
                                    victims++;
                                }
                            }
                            if (victims > 0) {
                                hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("magic203.wav"));
                                hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleMsg("You were blown out by a mysterious force...", Text.Black));
                            }
                        } else if (status.Counter == map.TimeLimit - 6) {
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("magic855.wav"));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleMsg("It's right nearby!  It's gusting hard!", Text.BrightRed));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleDivider());
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateChatMsg("It's right nearby!  It's gusting hard!", Text.BrightRed));
                        } else if (status.Counter == map.TimeLimit - 60) {
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("magic854.wav"));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleMsg("...It's getting closer!", Text.Blue));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleDivider());
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateChatMsg("...It's getting closer!", Text.Blue));
                        } else if (status.Counter == map.TimeLimit - 120) {
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("magic579.wav"));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleMsg("Something's approaching...", Text.BrightBlue));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleDivider());
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateChatMsg("Something's approaching...", Text.BrightBlue));
                        } else if (status.Counter == map.TimeLimit - 240) {
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSoundPacket("magic434.wav"));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleMsg("Something's stirring...", Text.BrightCyan));
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateBattleDivider());
                            hitlist.AddPacketToMap(map, PacketBuilder.CreateChatMsg("Something's stirring...", Text.BrightCyan));
                        }
                    } else if (map.Moral != Enums.MapMoral.House) {
                        AddMapStatus(map, "Wind", 0, "", -1, hitlist);
                    }

                    //semi-invulnerable attacks
                    TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Floor, 0, map, null, 0, 0, Enums.Direction.Up, true, true, false);
                    pointReached = true;
                    foreach (ICharacter i in targets.Foes) {
                        ExtraStatus extraStatus = i.VolatileStatus.GetStatus("SemiInvul");
                        if (extraStatus != null) {
                            extraStatus.Counter--;
                            if (extraStatus.Counter <= 0) {
                                BattleSetup setup = new BattleSetup();
                                setup.Attacker = i;
                                setup.moveSlot = -1;

                                BattleProcessor.HandleAttack(setup);

                                BattleProcessor.FinalizeAction(setup, hitlist);
                            }
                        }
                    }

                }

                status = map.TempStatus.GetStatus("TotalTime");
                if (status != null) {
                    status.Counter++;
                    if (status.Counter % 16 == 0) {
                        for (int i = 0; i < Server.Constants.MAX_MAP_ITEMS; i++) {
                            if (map.ActiveItem[i].Num != 0 && map.ActiveItem[i].Hidden) {
                                if (Server.Math.Rand(0,5) == 0) {
                                    foreach (Client n in map.GetClients()) {
                                        if (Server.AI.MovementProcessor.CanCharacterSeeDestination(map, n.Player.GetActiveRecruit(), map.ActiveItem[i].X, map.ActiveItem[i].Y)) {
                                            hitlist.AddPacketToMap(map, PacketBuilder.CreateSpellAnim(491, map.ActiveItem[i].X, map.ActiveItem[i].Y));
                                            hitlist.AddPacket(n, PacketBuilder.CreateSoundPacket("magic1022.wav"));
                                        }
                                    }
                                }
                            }
                        }
                    }
                } else {
                    AddMapStatus(map, "TotalTime", 0, "", -1, hitlist);
                }

                PacketHitList.MethodEnded(ref hitlist);
            } catch (Exception ex) {
                Messenger.AdminMsg("Error: OnMapTick", Text.Black);
                Messenger.AdminMsg("Map ID: " + map.MapID, Text.Black);
                Messenger.AdminMsg("Map Name: " + map.Name, Text.Black);
                Messenger.AdminMsg(pointReached.ToString(), Text.Black);
                Messenger.AdminMsg(ex.ToString(), Text.Black);
            }
        }
示例#25
0
        public static void BeforeMoveUsed(BattleSetup setup)
        {
            try {
                ExtraStatus status;
                setup.AttackerMultiplier = 1000;
                bool sayMove = false;
                bool semiInvul = false;

                //For forcing the next attack
                //of chargeup attacks (solarbeam/skull bash/razor wind/sky attack/dig/fly/etc.
                if (setup.Attacker.VolatileStatus.GetStatus("SolarBeam") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 218;
                    sayMove = true;
                } else if (setup.Attacker.VolatileStatus.GetStatus("SkullBash") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 424;
                    sayMove = true;
                } else if (setup.Attacker.VolatileStatus.GetStatus("RazorWind") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 243;
                    sayMove = true;
                } else if (setup.Attacker.VolatileStatus.GetStatus("SkyAttack") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 345;
                    sayMove = true;
                } else if (setup.Attacker.VolatileStatus.GetStatus("FocusPunch") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 441;
                    sayMove = true;
                } else if (setup.Attacker.VolatileStatus.GetStatus("Bide") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 248;
                    sayMove = true;
                } else if (setup.Attacker.VolatileStatus.GetStatus("Avalanche") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 362;
                    sayMove = true;
                } else if (setup.Attacker.VolatileStatus.GetStatus("VitalThrow") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 321;
                    sayMove = true;
                } else if (setup.Attacker.VolatileStatus.GetStatus("SkyDrop:1") != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = 640;
                    sayMove = true;
                } else {
                    status = setup.Attacker.VolatileStatus.GetStatus("SemiInvul");
                    if (status != null) {
                        if (status.Tag == "Dig") {
                            setup.moveSlot = -1;
                            setup.moveIndex = 146;
                            sayMove = true;
                        } else if (status.Tag == "Bounce") {
                            setup.moveSlot = -1;
                            setup.moveIndex = 73;
                            sayMove = true;
                        } else if (status.Tag == "Fly") {
                            setup.moveSlot = -1;
                            setup.moveIndex = 423;
                            sayMove = true;
                        } else if (status.Tag == "ShadowForce") {
                            setup.moveSlot = -1;
                            setup.moveIndex = 42;
                            sayMove = true;
                        } else if (status.Tag == "Dive") {
                            setup.moveSlot = -1;
                            setup.moveIndex = 297;
                            sayMove = true;
                        } else if (status.Tag == "PhantomForce") {
                            setup.moveSlot = -1;
                            setup.moveIndex = 739;
                            sayMove = true;
                        }
                        RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "SemiInvul", setup.PacketStack, false);
                        semiInvul = true;
                    }
                }

                //of rampage attacks
                status = setup.Attacker.VolatileStatus.GetStatus("Rampage");
                if (status != null) {

                        setup.moveSlot = -1;
                        setup.moveIndex = status.Tag.ToInt();
                        sayMove = true;
                }

                //of rolling attacks
                status = setup.Attacker.VolatileStatus.GetStatus("Rolling");
                if (status != null) {
                    setup.moveSlot = -1;
                    setup.moveIndex = status.Tag.ToInt();
                    sayMove = true;
                }

                //cancel fury cutter multipliers if using a different move
                if (setup.Attacker.VolatileStatus.GetStatus("FuryCutter") != null) {

                        if (setup.moveIndex != 175) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "FuryCutter", setup.PacketStack);
                        }

                }

                if (setup.moveSlot > -1 && setup.moveSlot < 4) {
                    setup.moveIndex = setup.Attacker.Moves[setup.moveSlot].MoveNum;
                    sayMove = true;
                }
                if (setup.moveIndex < 1) {
                    setup.moveIndex = -1;
                    setup.SetupMove(MoveManager.StandardAttack);
                } else {
                    setup.SetupMove(MoveManager.Moves[setup.moveIndex]);
                    if (GetBattleTagArg(setup.BattleTags, "InvokedMove", 0) != null ||
                        GetBattleTagArg(setup.BattleTags, "OrderedMove", 0) != null) {
                        sayMove = true;
                    }
                }

                //surf check
                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit &&
                        setup.moveIndex == 462) {
                    int x = setup.Attacker.X;
                    int y = setup.Attacker.Y;
                    MoveInDirection(setup.Attacker.Direction, 1, ref x, ref y);
                    if (x >= 0 && x <= setup.AttackerMap.MaxX && y >= 0 && y <= setup.AttackerMap.MaxY) {
                        Tile tile = ((Recruit)setup.Attacker).Owner.Player.Map.Tile[x, y];
                        if (tile.Type == Enums.TileType.ScriptedSign) {
                            if (tile.Data1 == 17) {
                                Messenger.PlayerWarp(((Recruit)setup.Attacker).Owner, tile.String1.ToInt(), tile.String2.ToInt(), tile.String3.ToInt());
                                setup.Cancel = true;
                                return;
                            }
                        }
                    }
                }
                //fly check
                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit &&
                        setup.moveIndex == 423) {
                        Tile tile = ((Recruit)setup.Attacker).Owner.Player.Map.Tile[setup.Attacker.X, setup.Attacker.Y];
                    if (tile.Type == Enums.TileType.Scripted) {
                        if (tile.Data1 == 14) {
                            //Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "But it failed...", Text.BrightRed);
                            //setup.Cancel = true;
                            //return;
                            Messenger.PlayerWarp(((Recruit)setup.Attacker).Owner, tile.String1.ToInt(), tile.String2.ToInt(), tile.String3.ToInt());
                            setup.Cancel = true;
                            return;
                        }
                    }
                }
                //Dive check
                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit &&
                        setup.moveIndex == 297) {
                        Tile tile = ((Recruit)setup.Attacker).Owner.Player.Map.Tile[setup.Attacker.X, setup.Attacker.Y];
                    if (tile.Type == Enums.TileType.Scripted) {
                        if (tile.Data1 == 76) {
                            //Messenger.PlayerMsg(((Recruit)setup.Attacker).Owner, "But it failed...", Text.BrightRed);
                            //setup.Cancel = true;
                            //return;
                            Messenger.PlayerWarp(((Recruit)setup.Attacker).Owner, tile.String1.ToInt(), tile.String2.ToInt(), tile.String3.ToInt());
                            setup.Cancel = true;
                            return;
                        }
                    }
                }
                //rock climb check
                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit &&
                        setup.moveIndex == 456) {
                    int x = setup.Attacker.X;
                    int y = setup.Attacker.Y;
                    MoveInDirection(setup.Attacker.Direction, 1, ref x, ref y);
                    if (x >= 0 && x <= setup.AttackerMap.MaxX && y >= 0 && y <= setup.AttackerMap.MaxY) {
                        Tile tile = ((Recruit)setup.Attacker).Owner.Player.Map.Tile[x, y];
                        if (tile.Type == Enums.TileType.ScriptedSign) {
                            if (tile.Data1 == 20) {
                                setup.Attacker.X = x;
                                setup.Attacker.Y = y;
                                PacketBuilder.AppendPlayerXY(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                                setup.Cancel = true;
                                return;
                            }
                        }
                    }
                }

                //unfinished move check
                if (setup.moveIndex > 0) {
                    if (MoveManager.Moves[setup.moveIndex].Name.EndsWith("\'") || MoveManager.Moves[setup.moveIndex].Name.EndsWith("`")) {
                        if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit && Ranks.IsAllowed(((Recruit)setup.Attacker).Owner, Enums.Rank.Moniter)) {

                        } else {
                            setup.Cancel = true;
                            return;
                        }
                    }

                }

                if (sayMove) {
                    setup.Move.Name = setup.Attacker.Name + " used " + setup.Move.Name + "!";
                } else {
                    setup.Move.Name = "";
                }

                if (GetBattleTagArg(setup.BattleTags, "InvokedMove", 0) == null) {
                    //check against cooldown
                    if (GetBattleTagArg(setup.BattleTags, "OrderedMove", 0) == null) {
                        if (setup.Attacker.PauseTimer == null) {
                            setup.Attacker.PauseTimer = new TickCount(Core.GetTickCount().Tick);
                        }
                        if (setup.Attacker.PauseTimer.Tick > Core.GetTickCount().Tick) {
                            setup.Cancel = true;
                            return;
                        }
                        if (setup.Attacker.AttackTimer == null ||
                            setup.Move.AdditionalEffectData1 == 9 ||
                            setup.Move.AdditionalEffectData1 == 128 ||
                            setup.Move.AdditionalEffectData1 == 132) {
                            setup.Attacker.AttackTimer = new TickCount(Core.GetTickCount().Tick);
                        }
                        if (setup.Attacker.AttackTimer.Tick > Core.GetTickCount().Tick) {
                            setup.Cancel = true;
                            return;
                        }
                    }

                    //check against freeze/paralyze/sleep
                    if (setup.Attacker.StatusAilment == Enums.StatusAilment.Freeze) {
                        if (Server.Math.Rand(0, 3) == 0 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK.ToString(), false, setup.PacketStack)) {
                            SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                        } else if ((setup.Move.AdditionalEffectData1 == 37 || setup.Move.AdditionalEffectData1 == 38) && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK.ToString(), true, setup.PacketStack)) {

                            SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is frozen solid!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return;
                        }
                    } else if (setup.Attacker.StatusAilment == Enums.StatusAilment.Paralyze) {
                        if (Server.Math.Rand(0, 5) == 0) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is paralyzed!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic184.wav"));
                            setup.Cancel = true;
                            return;
                        }
                    } else if (setup.Attacker.StatusAilment == Enums.StatusAilment.Sleep) {
                        setup.Attacker.StatusAilmentCounter--;
                        if (setup.Attacker.StatusAilmentCounter <= 0 && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK.ToString(), false, setup.PacketStack)) {
                            SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                        } else if (setup.Move.AdditionalEffectData1 == 35 || setup.Move.Data1 == 36) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is fast asleep...", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is fast asleep...", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return;
                        }
                    }

                    //check against wrapping (victim)
                    int trapdmg;
                    status = setup.Attacker.VolatileStatus.GetStatus("Bind:0");
                    if (status != null) {
                        status.Counter--;
                        if (status.Target == null) {
                            setup.Attacker.VolatileStatus.Remove(status);
                        } else if (status.Counter <= 0 || !MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, status.Target.X, status.Target.Y) ||
                            status.Target.MapID != setup.AttackerMap.MapID || setup.Move.AdditionalEffectData1 == 85) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Bind:0", setup.PacketStack, true);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is struggling to get free!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return;
                        }
                    }
                    status = setup.Attacker.VolatileStatus.GetStatus("Bind:1");
                    if (status != null) {
                        if (status.Target == null) {
                            setup.Attacker.VolatileStatus.Remove(status);
                        } else if (!MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, status.Target.X, status.Target.Y) ||
                            status.Target.MapID != setup.AttackerMap.MapID) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Bind:1", setup.PacketStack, true);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s attack continues!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Tag == "1") {
                                trapdmg = status.Target.MaxHP / 12;
                            } else {
                                trapdmg = status.Target.MaxHP / 16;
                            }
                            if (trapdmg < 1) trapdmg = 1;
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), trapdmg, Enums.KillType.Player, setup.PacketStack, true);
                            } else if (setup.Attacker.CharacterType == Enums.CharacterType.MapNpc) {
                                DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), trapdmg, Enums.KillType.Npc, setup.PacketStack, true);
                            }
                            setup.Cancel = true;
                            return;
                        }
                    }

                    status = setup.Attacker.VolatileStatus.GetStatus("Clamp:0");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0 ||
                            !MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, status.Target.X, status.Target.Y) ||
                            status.Target.MapID != setup.AttackerMap.MapID ||
                            setup.Move.AdditionalEffectData1 == 85) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Clamp:0", setup.PacketStack, true);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is struggling to get free!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return;
                        }
                    }
                    status = setup.Attacker.VolatileStatus.GetStatus("Clamp:1");
                    if (status != null) {
                        if (status.Target == null) {
                            setup.Attacker.VolatileStatus.Remove(status);
                        } else if (!MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, status.Target.X, status.Target.Y) ||
                            status.Target.MapID != setup.AttackerMap.MapID) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Clamp:1", setup.PacketStack, true);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s attack continues!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Tag == "1") {
                                trapdmg = status.Target.MaxHP / 12;
                            } else {
                                trapdmg = status.Target.MaxHP / 16;
                            }
                            if (trapdmg < 1) trapdmg = 1;
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), trapdmg, Enums.KillType.Player, setup.PacketStack, true);
                            } else if (setup.Attacker.CharacterType == Enums.CharacterType.MapNpc) {
                                DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), trapdmg, Enums.KillType.Npc, setup.PacketStack, true);
                            }
                            setup.Cancel = true;
                            return;
                        }
                    }

                    status = setup.Attacker.VolatileStatus.GetStatus("Wrap:0");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0 || !MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, status.Target.X, status.Target.Y) ||
                            status.Target.MapID != setup.AttackerMap.MapID || setup.Move.AdditionalEffectData1 == 85) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Wrap:0", setup.PacketStack, true);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is struggling to get free!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return;
                        }
                    }
                    status = setup.Attacker.VolatileStatus.GetStatus("Wrap:1");
                    if (status != null) {
                        if (status.Target == null) {
                            setup.Attacker.VolatileStatus.Remove(status);
                        } else if (!MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, status.Target.X, status.Target.Y) ||
                            status.Target.MapID != setup.AttackerMap.MapID) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Wrap:1", setup.PacketStack, true);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s attack continues!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Tag == "1") {
                                trapdmg = status.Target.MaxHP / 12;
                            } else {
                                trapdmg = status.Target.MaxHP / 16;
                            }
                            if (trapdmg < 1) trapdmg = 1;
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), trapdmg, Enums.KillType.Player, setup.PacketStack, true);
                            } else if (setup.Attacker.CharacterType == Enums.CharacterType.MapNpc) {
                                DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), trapdmg, Enums.KillType.Npc, setup.PacketStack, true);
                            }
                            setup.Cancel = true;
                            return;
                        }
                    }

                    status = setup.Attacker.VolatileStatus.GetStatus("SkyDrop:0");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0 || !MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, status.Target.X, status.Target.Y) ||
                            status.Target.MapID != setup.AttackerMap.MapID) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "SkyDrop:0", setup.PacketStack, true);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is struggling to get free!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return;
                        }
                    }
                    status = setup.Attacker.VolatileStatus.GetStatus("SkyDrop:1");
                    if (status != null) {
                        if (status.Target == null) {
                            setup.Attacker.VolatileStatus.Remove(status);
                        } else if (!MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, status.Target.X, status.Target.Y) ||
                            status.Target.MapID != setup.AttackerMap.MapID) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "SkyDrop:1", setup.PacketStack, true);
                        } else {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "SkyDrop:1", setup.PacketStack, false);
                            //execute the move
                            setup.BattleTags.Add("SkyDrop");
                        }
                    }

                //check against confusion
                    status = setup.Attacker.VolatileStatus.GetStatus("Confusion");
                if (status != null) {
                    status.Counter -= 2;
                    if (status.Counter <= 0) {
                        RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Confusion", setup.PacketStack, true);
                    } else if (Server.Math.Rand(0, 2) == 0 && !(HasAbility(setup.Attacker, "Tangled Feet") && HasAbility(setup.Attacker, "Own Tempo"))) {
                        setup.moveSlot = -1;
                        setup.moveIndex = -1;
                        setup.SetupMove(MoveManager.StandardAttack);
                        setup.Move.TargetType = Enums.MoveTarget.User;
                        setup.Move.Name = setup.Attacker.Name + " attacked itself in confusion!";
                    }
                }

                    //check against attraction
                status = setup.Attacker.VolatileStatus.GetStatus("Attract");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveBondedExtraStatus(setup.Attacker, setup.AttackerMap, "Attract", setup.PacketStack, true);
                        } else {

                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is immobilized by love!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.Cancel = true;
                            return;
                        }
                    }

                    if (setup.moveSlot > -1 && setup.moveSlot < 4) {
                        if (setup.Attacker.Moves[setup.moveSlot].CurrentPP <= 0) {
                            bool noMovesLeft = true;
                            for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                                if (setup.Attacker.Moves[i].CurrentPP > 0 && !setup.Attacker.Moves[i].Sealed) {
                                    noMovesLeft = false;
                                    break;
                                }
                            }
                            if (noMovesLeft) {
                                setup.moveSlot = -1;
                                setup.moveIndex = 466;//struggle
                                setup.SetupMove(MoveManager.Moves[setup.moveIndex]);
                                setup.Move.Name = setup.Attacker.Name + " used " + setup.Move.Name + "!";
                            } else {
                                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                    setup.PacketStack.AddPacket(((Recruit)setup.Attacker).Owner, PacketBuilder.CreateBattleMsg("There's no PP left for that move!", Text.BrightRed));
                                    PacketBuilder.AppendMovePPUpdate(((Recruit)setup.Attacker).Owner, setup.PacketStack, setup.moveSlot);
                                }
                                setup.Cancel = true;
                                return;
                            }

                        } else if (setup.Attacker.Moves[setup.moveSlot].Sealed) {
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                setup.PacketStack.AddPacket(((Recruit)setup.Attacker).Owner, PacketBuilder.CreateBattleMsg("The move is sealed!  It can't be used!", Text.BrightRed));
                                PacketBuilder.AppendPlayerMoves(((Recruit)setup.Attacker).Owner, setup.PacketStack);
                            }
                            setup.Cancel = true;
                            return;

                        } else {
                            bool deductPP = true;
                            if (setup.Attacker.HasActiveItem(340)) deductPP = false;

                            if (Server.Math.Rand(0, 4) <= 0 && HasActiveBagItem(setup.Attacker, 13, 0, 0)) {
                                deductPP = false;
                            }
                            if (deductPP) setup.Attacker.Moves[setup.moveSlot].CurrentPP--;

                            status = setup.Attacker.VolatileStatus.GetStatus("LastUsedMoveSlot");
                            if (status == null || status.Counter != setup.moveSlot) {
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "LastUsedMoveSlot", setup.moveSlot, null, "", setup.PacketStack);
                                AddExtraStatus(setup.Attacker, setup.AttackerMap, "TimesLastMoveUsed", 1, null, "", setup.PacketStack);
                            } else {
                                status = setup.Attacker.VolatileStatus.GetStatus("TimesLastMoveUsed");
                                if (status != null) {
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "TimesLastMoveUsed", status.Counter + 1, null, "", setup.PacketStack);
                                } else {
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "TimesLastMoveUsed", 1, null, "", setup.PacketStack);
                                }
                            }

                            //send PP update to players
                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                PacketBuilder.AppendMovePPUpdate(((Recruit)setup.Attacker).Owner, setup.PacketStack, setup.moveSlot);
                            }

                            if (setup.Attacker.HasActiveItem(256) || setup.Attacker.HasActiveItem(257) || setup.Attacker.HasActiveItem(258)) {
                                for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                                    if (i != setup.moveSlot) {
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "MoveSeal:" + i, 0, null, "", setup.PacketStack, false);
                                    }
                                }
                            }

                        }
                    }// else if (setup.Move.EffectType == Enums.MoveType.SubHP) {
                    //    switch (setup.Move.Data2) {
                    //        case 1: {
                    //                if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                    //                    ((Recruit)setup.Attacker).Owner.Player.TakeItem(setup.Move.Data3, 1);
                    //                }
                    //                break;
                    //            }

                    //    }
                    //}

                }

                //For the charging of chargeup attacks (solarbeam/skull bash/razor wind/sky attack/dig/fly/etc.
                if (setup.Attacker.VolatileStatus.GetStatus("SolarBeam") != null) {
                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "SolarBeam", setup.PacketStack);
                } else if (setup.Attacker.VolatileStatus.GetStatus("SkullBash") != null) {
                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "SkullBash", setup.PacketStack);
                } else if (setup.Attacker.VolatileStatus.GetStatus("RazorWind") != null) {
                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "RazorWind", setup.PacketStack);
                } else if (setup.Attacker.VolatileStatus.GetStatus("SkyAttack") != null) {
                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "SkyAttack", setup.PacketStack);
                } else if (setup.Attacker.VolatileStatus.GetStatus("FocusPunch") != null) {
                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "FocusPunch", setup.PacketStack, false);
                } else if (setup.Attacker.VolatileStatus.GetStatus("Bide") != null) {
                    setup.Move.Data1 = 30;
                    setup.Move.Data2 = setup.Attacker.VolatileStatus.GetStatus("Bide").Counter * 2;
                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Bide", setup.PacketStack);
                } else if (setup.Attacker.VolatileStatus.GetStatus("Avalanche") != null) {
                    if (GetBattleTagArg(setup.BattleTags, "Avalanche", 0) != null) {
                        setup.Move.Data1 *= 2;
                    }
                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Avalanche", setup.PacketStack);
                } else if (setup.Attacker.VolatileStatus.GetStatus("VitalThrow") != null) {
                    RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "VitalThrow", setup.PacketStack);
                    if (GetBattleTagArg(setup.BattleTags, "VitalThrow", 0) != null) {

                    } else {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " gave up on Vital Throw!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                        setup.Cancel = true;
                        return;
                    }
                } else if (semiInvul) {

                } else {
                    if (setup.Move.AdditionalEffectData1 == 60 && setup.Attacker.VolatileStatus.GetStatus("SuperCharge") == null) {
                        switch (setup.Move.AdditionalEffectData2) {
                            case 1: {//solarbeam
                                    if (GetCharacterWeather(setup.Attacker) != Enums.Weather.Sunny) {
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "SolarBeam", 0, null, "", setup.PacketStack);
                                        setup.Cancel = true;
                                        return;
                                    }
                                }
                                break;
                            case 2: {//skull bash
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "SkullBash", 0, null, "", setup.PacketStack);
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 3: {//razor wind
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "RazorWind", 0, null, "", setup.PacketStack);
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 4: {//sky attack
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "SkyAttack", 0, null, "", setup.PacketStack);
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 5: {//focus punch
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "FocusPunch", 0, null, "", setup.PacketStack);
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 6: {//Dig
                                    bool passable = false;
                                    Tile tile = setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y];
                                    if (tile.Type == Enums.TileType.Arena) {
                                        passable = true;
                                    } else if (tile.Type == Enums.TileType.Walkable || tile.Type == Enums.TileType.Hallway || tile.Type == Enums.TileType.NPCAvoid) {
                                        if (tile.Data1 == 0) passable = true;
                                    } else if (tile.Type == Enums.TileType.MobileBlock) {
                                        if (tile.Data1 <= 0) passable = true;
                                    }
                                    if (passable) {
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "SemiInvul", 20, null, "Dig", setup.PacketStack);
                                    } else {
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " can't dig here!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 7: {//Bounce
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "SemiInvul", 8, null, "Bounce", setup.PacketStack);
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 8: {//Fly
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "SemiInvul", 12, null, "Fly", setup.PacketStack);
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 9: {//Shadow Force
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "SemiInvul", 14, null, "ShadowForce", setup.PacketStack);
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 10: {//Dive
                                    bool passable = false;
                                    Tile tile = setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y];
                                    if (tile.Type == Enums.TileType.Arena) {
                                        passable = true;
                                    } else if (tile.Type == Enums.TileType.Walkable || tile.Type == Enums.TileType.Hallway) {
                                        if (tile.Data1 == 1) passable = true;
                                    } else if (tile.Type == Enums.TileType.MobileBlock) {
                                        if (tile.Data1 == 2) passable = true;
                                    }
                                    if (passable) {
                                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "SemiInvul", 20, null, "Dive", setup.PacketStack);
                                    } else {
                                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " can't dive here!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                    }
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                            case 11: {//Phantom Force
                                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "SemiInvul", 14, null, "PhantomForce", setup.PacketStack);
                                    setup.Cancel = true;
                                    return;
                                }
                                break;
                        }
                    } else if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 68) {
                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Bide", 0, null, "", setup.PacketStack);
                        setup.Cancel = true;
                        return;
                    } else if (setup.Move.AdditionalEffectData1 == 186) {
                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Avalanche", 0, null, "", setup.PacketStack);
                        setup.Cancel = true;
                        return;
                    } else if (setup.Move.AdditionalEffectData1 == 187) {
                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "VitalThrow", 0, null, "", setup.PacketStack);
                        setup.Cancel = true;
                        return;
                    } else if (setup.Move.AdditionalEffectData1 == 197 && GetBattleTagArg(setup.BattleTags, "SkyDrop", 0) == null) {//sky drop
                        setup.Move.Name = "";
                    }
                }

                if (HasAbility(setup.Attacker, "Protean") && setup.Move.Element != Enums.PokemonType.None
                    && (setup.Move.Element != setup.Attacker.Type1 && setup.Attacker.Type1 != Enums.PokemonType.None || setup.Move.Element != setup.Attacker.Type2 && setup.Attacker.Type2 != Enums.PokemonType.None)) {
                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type1", (int)setup.Move.Element, null, "", setup.PacketStack);
                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "Type2", 0, null, "", setup.PacketStack);
                }
            } catch (Exception ex) {
                Messenger.AdminMsg("Error: BeforeMoveUsed", Text.Black);
                Messenger.AdminMsg("Slot: " + setup.moveSlot + ", Name: " + MoveManager.Moves[setup.moveIndex].Name, Text.Black);
                Messenger.AdminMsg("Map: " + setup.AttackerMap.MapID + " Name: " + setup.AttackerMap.Name, Text.Black);
                Messenger.AdminMsg(ex.ToString(), Text.Black);
            }
        }
示例#26
0
        public static void CheckAfterActionTakenAbility(BattleSetup setup)
        {
            //Bad Dreams
            if (setup.Attacker.StatusAilment == Enums.StatusAilment.Sleep) {
                TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Floor, 0, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, true, false, false);
                for (int i = 0; i < targets.Foes.Count; i++) {
                    if (HasAbility(targets.Foes[i], "Bad Dreams")) {
                        if (setup.Attacker.HasActiveItem(498)) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Lunar Wing kept the bad dreams away!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                        } else {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is having bad dreams!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            int dmg = setup.Attacker.MaxHP / 16;
                            if (setup.Attacker.MaxHP / 16 >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP / 16, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP / 16, Enums.KillType.Other, setup.PacketStack, true);
                            }
                            break;
                        }
                    }
                }
            }

            //Early Bird
            if (HasAbility(setup.Attacker, "Early Bird") && setup.Attacker.StatusAilment == Enums.StatusAilment.Sleep && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK.ToString(), false, setup.PacketStack)) {
                setup.Attacker.StatusAilmentCounter = 0;

            }

            //Healer
            if (!CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK.ToString(), false, setup.PacketStack)) {
                TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, false, true, false);
                for (int i = 0; i < targets.Friends.Count; i++) {
                    if (HasAbility(targets.Friends[i], "Healer")) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(targets.Friends[i].Name + "'s Healer cured " + setup.Attacker.Name + "'s status problem!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                        SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                        break;
                    }
                }
            }

            if (HasAbility(setup.Attacker, "Hydration") && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK.ToString(), false, setup.PacketStack)) {
                if (GetCharacterWeather(setup.Attacker) == Enums.Weather.Raining || GetCharacterWeather(setup.Attacker) == Enums.Weather.Thunder) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Hydration cured its status problem!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                }
            }
            if (HasAbility(setup.Attacker, "Shed Skin") && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK.ToString(), false, setup.PacketStack)) {
                if (Server.Math.Rand(0, 3) == 0) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Shed Skin cured its status problem!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                    SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                }
            }
        }
示例#27
0
        public static void AfterActionTaken(BattleSetup setup)
        {
            int pointReached = 0;
            try {
                ExtraStatus status;
                if (GetBattleTagArg(setup.BattleTags, "InvokedMove", 0) == null) {
                    pointReached = 1;
                    if (setup.Attacker.AttackTimer == null || setup.Attacker.AttackTimer.Tick < Core.GetTickCount().Tick) {

                        setup.Attacker.AttackTimer = new TickCount(Core.GetTickCount().Tick);

                    }
                    pointReached = 2;
                    if (setup.Attacker.PauseTimer == null || setup.Attacker.PauseTimer.Tick < Core.GetTickCount().Tick) {
                        setup.Attacker.PauseTimer = new TickCount(Core.GetTickCount().Tick);
                    }

                    pointReached = 3;

                    //gluttony rewards
                    if (GetBattleTagArg(setup.BattleTags, "Gluttony", 1) != null) {
                        HealCharacter(setup.Attacker, setup.AttackerMap, GetBattleTagArg(setup.BattleTags, "Gluttony", 1).ToInt(), setup.PacketStack);
                    }

                    //magic coat
                    status = setup.Attacker.VolatileStatus.GetStatus("MagicCoat");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "MagicCoat", setup.PacketStack);
                        }
                    }

                    //mirror coat
                    status = setup.Attacker.VolatileStatus.GetStatus("MirrorCoat");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "MirrorCoat", setup.PacketStack);
                        }
                    }

                    //counter
                    status = setup.Attacker.VolatileStatus.GetStatus("Counter");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Counter", setup.PacketStack);
                        }
                    }

                    status = setup.Attacker.VolatileStatus.GetStatus("Charge");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Charge", setup.PacketStack);
                        }
                    }
                    pointReached = 4;

                    //yawn
                    status = setup.Attacker.VolatileStatus.GetStatus("Yawn");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Yawn", setup.PacketStack);
                            SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Sleep, Server.Math.Rand(2, 4), setup.PacketStack);
                        }
                    }

                    pointReached = 5;

                    //nightmare
                    if (setup.Attacker.VolatileStatus.GetStatus("Nightmare") != null && setup.Attacker.StatusAilment == Enums.StatusAilment.Sleep) {
                        if (setup.Attacker.HasActiveItem(498)) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The Lunar Wing dispelled the nightmare!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Nightmare", setup.PacketStack);
                        } else {
                            int dmg = setup.Attacker.MaxHP / 8;
                            if (dmg < 1) dmg = 1;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is having nightmares!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (dmg >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, dmg, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, dmg, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                    }

                    //lunar wing
                    if (setup.Attacker.HasActiveItem(498) && setup.Attacker.StatusAilment == Enums.StatusAilment.Sleep) {
                        int heal = setup.Attacker.MaxHP / 32;
                        if (heal < 1) heal = 1;
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s health is restored by the Lunar Wing!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                        HealCharacter(setup.Attacker, setup.AttackerMap, heal, setup.PacketStack);
                    }

                    pointReached = 6;

                    //Leech Seed Damage
                    status = setup.Attacker.VolatileStatus.GetStatus("LeechSeed:0");
                    if (!HasAbility(setup.Attacker, "Magic Guard") && status != null) {
                        if (status.Target == null) {
                            setup.Attacker.VolatileStatus.Remove(status);
                        } else {
                            pointReached = 7;
                            int seeddmg = setup.Attacker.MaxHP / 32;
                            if (seeddmg < 1) seeddmg = 1;
                            int heal = 5;
                            if (status.Target.HasActiveItem(194)) heal = 6;
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s health is sapped by Leech Seed!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (seeddmg >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, seeddmg, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                                return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, seeddmg, Enums.KillType.Other, setup.PacketStack, true);
                            }
                            //HealCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), seeddmg * heal / 5, setup.PacketStack);
                            if (HasAbility(setup.Attacker, "Liquid Ooze")) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(status.Target.Name + " sucked up the Liquid Ooze!", Text.BrightRed), status.Target.X, status.Target.Y, 10);
                                DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), seeddmg, Enums.KillType.Other, setup.PacketStack, true);
                                if (seeddmg >= status.Target.HP) {
                                    DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), seeddmg, Enums.KillType.Other, setup.PacketStack, true);
                                    setup.Cancel = true;
                            return;
                                } else {
                                    DamageCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), seeddmg, Enums.KillType.Other, setup.PacketStack, true);
                                }
                            } else {
                                HealCharacter(status.Target, MapManager.RetrieveActiveMap(status.Target.MapID), seeddmg * heal / 5, setup.PacketStack);
                            }
                        }
                    }

                    pointReached = 8;

                    //sure shot
                    status = setup.Attacker.VolatileStatus.GetStatus("SureShot");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "SureShot", setup.PacketStack);
                        }
                    }

                    //taunt
                    status = setup.Attacker.VolatileStatus.GetStatus("Taunt");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Taunt", setup.PacketStack);
                        }
                    }

                    pointReached = 9;

                    //Snatch
                    status = setup.Attacker.VolatileStatus.GetStatus("Snatch");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Snatch", setup.PacketStack);
                        }
                    }

                    pointReached = 10;

                    //encore
                    status = setup.Attacker.VolatileStatus.GetStatus("Encore");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Encore", setup.PacketStack);
                        }
                    }

                    pointReached = 11;

                    //follow
                    status = setup.Attacker.VolatileStatus.GetStatus("Follow");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Follow", setup.PacketStack);
                        }
                    }

                    pointReached = 12;

                    //torment
                    //if (setup.Attacker.VolatileStatus.GetStatus("Torment") != null) {
                    //	setup.Attacker.VolatileStatus.GetStatus("Torment").Counter--;
                    //	if (setup.Attacker.VolatileStatus.GetStatus("Torment").Counter <= 0) {
                    //		RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Torment", setup.PacketStack);
                    //	}
                    //}

                    //embargo
                    status = setup.Attacker.VolatileStatus.GetStatus("Embargo");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Embargo", setup.PacketStack);
                        }
                    }

                    pointReached = 13;

                    //heal block
                    status = setup.Attacker.VolatileStatus.GetStatus("HealBlock");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "HealBlock", setup.PacketStack);
                        }
                    }

                    pointReached = 14;

                    //Burn Damage
                    if (setup.Attacker.StatusAilment == Enums.StatusAilment.Burn
                        && !HasAbility(setup.Attacker, "Heatproof")
                        && !(HasAbility(setup.Attacker, "Water Veil") && HasAbility(setup.Attacker, "Flare Boost"))
                        && !HasAbility(setup.Attacker, "Magic Guard")) {
                        int burndmg = setup.Attacker.MaxHP / 16;
                        if (burndmg < 1) burndmg = 1;
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is hurt by the burn!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                        if (burndmg >= setup.Attacker.HP) {
                            DamageCharacter(setup.Attacker, setup.AttackerMap, burndmg, Enums.KillType.Other, setup.PacketStack, true);
                            setup.Cancel = true;
                            return;
                        } else {
                            DamageCharacter(setup.Attacker, setup.AttackerMap, burndmg, Enums.KillType.Other, setup.PacketStack, true);
                        }
                    }

                    pointReached = 15;

                    //future sight
                    status = setup.Attacker.VolatileStatus.GetStatus("FutureSight");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "FutureSight", setup.PacketStack);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic118.wav"));
                            if (50 >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, 50, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, 50, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                    }

                    pointReached = 16;

                    //Curse Damage
                    if (!HasAbility(setup.Attacker, "Magic Guard")) {
                        status = setup.Attacker.VolatileStatus.GetStatus("Curse");
                        if (status != null) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is haunted by the curse...", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic3.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Counter >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, status.Counter, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, status.Counter, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                    }

                    pointReached = 17;

                    //Immobilization struggling
                    status = setup.Attacker.VolatileStatus.GetStatus("Immobilize");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Immobilize", setup.PacketStack, true);
                        }
                    }

                    pointReached = 19;

                    //Telekinesis struggling
                    status = setup.Attacker.VolatileStatus.GetStatus("Telekinesis");
                    if (status != null) {
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Telekinesis", setup.PacketStack, true);
                        }
                    }

                    pointReached = 20;

                    //Ingrain timer
                    status = setup.Attacker.VolatileStatus.GetStatus("Ingrain");
                    if (status != null) {
                        status.Counter--;
                        HealCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP / 6, setup.PacketStack);
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Ingrain", setup.PacketStack, true);
                        }
                    }

                    pointReached = 21;

                    //Aqua Ring
                    if ((setup.Attacker.CharacterType == Enums.CharacterType.MapNpc || ((Recruit)setup.Attacker).Belly > 0) &&
                        setup.Attacker.VolatileStatus.GetStatus("AquaRing") != null) {
                        int heal = setup.Attacker.MaxHP / 32;
                        if (heal < 1) heal = 1;
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s health is restored by Aqua Ring!", Text.BrightGreen), setup.Attacker.X, setup.Attacker.Y, 10);
                        HealCharacter(setup.Attacker, setup.AttackerMap, heal, setup.PacketStack);
                    }

                    pointReached = 22;

                    status = setup.Attacker.VolatileStatus.GetStatus("Invisible");
                    if (status != null) {
                        status.Counter -= 2;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Invisible", setup.PacketStack, true);
                        }
                    }

                    pointReached = 23;

                    int trapdmg = 0;
                    if (trapdmg < 1) trapdmg = 1;
                    status = setup.Attacker.VolatileStatus.GetStatus("FireSpin");
                    if (status != null) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(206, setup.Attacker.X, setup.Attacker.Y));
                        if (!HasAbility(setup.Attacker, "Magic Guard")) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is hurt by Fire Spin!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Tag == "1") {
                                trapdmg = setup.Attacker.MaxHP / 12;
                            } else {
                                trapdmg = setup.Attacker.MaxHP / 16;
                            }
                            if (trapdmg >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "FireSpin", setup.PacketStack, true);
                        }
                    }
                    status = setup.Attacker.VolatileStatus.GetStatus("Whirlpool");
                    if (status != null) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(203, setup.Attacker.X, setup.Attacker.Y));
                        if (!HasAbility(setup.Attacker, "Magic Guard")) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is hurt by Whirlpool!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Tag == "1") {
                                trapdmg = setup.Attacker.MaxHP / 12;
                            } else {
                                trapdmg = setup.Attacker.MaxHP / 16;
                            }
                            if (trapdmg >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Whirlpool", setup.PacketStack, true);
                        }
                    }
                    status = setup.Attacker.VolatileStatus.GetStatus("Infestation");
                    if (status != null) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(213, setup.Attacker.X, setup.Attacker.Y));
                        if (!HasAbility(setup.Attacker, "Magic Guard")) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is hurt by an Infestation!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Tag == "1") {
                                trapdmg = setup.Attacker.MaxHP / 12;
                            } else {
                                trapdmg = setup.Attacker.MaxHP / 16;
                            }
                            if (trapdmg >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "Infestation", setup.PacketStack, true);
                        }
                    }
                    status = setup.Attacker.VolatileStatus.GetStatus("SandTomb");
                    if (status != null) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(148, setup.Attacker.X, setup.Attacker.Y));
                        if (!HasAbility(setup.Attacker, "Magic Guard")) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is hurt by Sand Tomb!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Tag == "1") {
                                trapdmg = setup.Attacker.MaxHP / 12;
                            } else {
                                trapdmg = setup.Attacker.MaxHP / 16;
                            }
                            if (trapdmg >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "SandTomb", setup.PacketStack, true);
                        }
                    }
                    status = setup.Attacker.VolatileStatus.GetStatus("MagmaStorm");
                    if (status != null) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSpellAnim(94, setup.Attacker.X, setup.Attacker.Y));
                        if (!HasAbility(setup.Attacker, "Magic Guard")) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " is hurt by Magma Storm!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            if (status.Tag == "1") {
                                trapdmg = setup.Attacker.MaxHP / 12;
                            } else {
                                trapdmg = setup.Attacker.MaxHP / 16;
                            }
                            if (trapdmg >= setup.Attacker.HP) {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                                setup.Cancel = true;
                            return;
                            } else {
                                DamageCharacter(setup.Attacker, setup.AttackerMap, trapdmg, Enums.KillType.Other, setup.PacketStack, true);
                            }
                        }
                        status.Counter--;
                        if (status.Counter <= 0) {
                            RemoveExtraStatus(setup.Attacker, setup.AttackerMap, "MagmaStorm", setup.PacketStack, true);
                        }
                    }

                    pointReached = 24;

                    //Life Orb
                    if (setup.Attacker.HasActiveItem(143) && setup.BattleTags.Contains("HitSomething") && !HasAbility(setup.Attacker, "Magic Guard")) {
                        if (setup.Attacker.MaxHP / 32 >= setup.Attacker.HP) {
                            DamageCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP / 32, Enums.KillType.Other, setup.PacketStack, true);
                            setup.Cancel = true;
                            return;
                        } else {
                            DamageCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP / 32, Enums.KillType.Other, setup.PacketStack, true);
                        }
                    }

                    pointReached = 25;

                    //Orb Damage
                    if (setup.Attacker.HasActiveItem(169) && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Poison.ToString() + ":2", false, setup.PacketStack)) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The Toxic Orb activated!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                        SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Poison, 2, setup.PacketStack);
                    } else if (setup.Attacker.HasActiveItem(163) && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Burn.ToString(), false, setup.PacketStack)) {
                        setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("The Flame Orb activated!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                        SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);
                    }

                    pointReached = 26;

                    //check ability
                    CheckAfterActionTakenAbility(setup);

                    pointReached = 27;

                    //Perish Song
                    status = setup.Attacker.VolatileStatus.GetStatus("PerishCount");
                    if (setup.Attacker.VolatileStatus.GetStatus("PerishCount") != null) {
                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "PerishCount", status.Counter - 1, null, "", setup.PacketStack);

                        if (status.Counter <= 1) {
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic118.wav"));
                            DamageCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.HP, Enums.KillType.Other, setup.PacketStack, true);
                            setup.Cancel = true;
                            return;
                        }
                    }

                    pointReached = 28;

                    if (setup.Attacker.MapID == setup.AttackerMap.MapID) {
                        if (setup.AttackerMap.MapType != Enums.MapType.RDungeonMap) {
                        } else if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.MobileBlock) {

                            int mobilityList = setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Data1;
                            bool blocked = false;
                            for (int i = 0; i < 16; i++) {
                                if (mobilityList % 2 == 1 && !setup.Attacker.Mobility[i]) {
                                    blocked = true;
                                }
                                mobilityList /= 2;
                            }

                            if (blocked == true) {
                                RandomWarp(setup.Attacker, setup.AttackerMap, false, setup.PacketStack);
                            }
                        } else if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Blocked) {
                            RandomWarp(setup.Attacker, setup.AttackerMap, false, setup.PacketStack);
                        }
                        if (setup.AttackerMap.Tile[setup.Attacker.X, setup.Attacker.Y].Type == Enums.TileType.Slippery &&
                            setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                            if (((Recruit)setup.Attacker).Belly <= 0) {
                                RandomWarp(setup.Attacker, setup.AttackerMap, false, setup.PacketStack);
                            }
                        }
                    }

                    pointReached = 29;

                    if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit && setup.AttackerMap.HungerEnabled) {
                        if (setup.Attacker.HasActiveItem(103)) {

                        } else if (setup.Attacker.HasActiveItem(151)) {
                            if (setup.moveIndex > 0) {
                            ((Recruit)setup.Attacker).Owner.Player.BellyStepCounter += 25;
                            } else {
                                ((Recruit)setup.Attacker).Owner.Player.BellyStepCounter += 5;
                            }
                        } else {
                            if (setup.moveIndex > 0) {
                            ((Recruit)setup.Attacker).Owner.Player.BellyStepCounter += 50;
                            } else {
                                ((Recruit)setup.Attacker).Owner.Player.BellyStepCounter += 10;
                            }
                        }
                        if (setup.Attacker.HasActiveItem(144)) {
                            ((Recruit)setup.Attacker).Owner.Player.BellyStepCounter += 50;
                        }
                        ((Recruit)setup.Attacker).Owner.Player.ProcessHunger(setup.PacketStack);
                    }
                }
                pointReached = 30;
            } catch (Exception ex) {
                Messenger.AdminMsg("Error: AfterActionTaken", Text.Black);
                Messenger.AdminMsg(pointReached.ToString(), Text.Black);
                if (setup.AttackerMap != null) {
                    Messenger.AdminMsg(setup.AttackerMap.Name, Text.Black);
                }
                if (setup.Attacker != null) {
                    Messenger.AdminMsg(setup.Attacker.Name, Text.Black);
                }
                if (setup.Defender != null) {
                    Messenger.AdminMsg(setup.Defender.Name, Text.Black);
                }
                Messenger.AdminMsg(ex.ToString(), Text.Black);
            }
        }
示例#28
0
        public static void CheckAfterMoveHitAbility(BattleSetup setup)
        {
            if (HasAbility(setup.Defender, "Anger Point") && setup.Move.MoveCategory != Enums.MoveCategory.Status) {
                if (setup.BattleTags.Contains("Critical")) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Anger Point was triggered!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    ChangeAttackBuff(setup.Defender, setup.DefenderMap, 20, setup.PacketStack);
                }
            }
            if (HasAbility(setup.Defender, "Arena Trap")/* && (setup.Defender.HP > 0 || !setup.KnockedOut)*/ && MoveProcessor.IsInAreaRange(3, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)
                && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, "Immobilize", false, setup.PacketStack)
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (IsGroundImmune(setup.Attacker, setup.DefenderMap)) {

                } else {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Arena Trap prevented escape!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "Immobilize", 2, null, "", setup.PacketStack);
                }
            }
            if (HasAbility(setup.Attacker, "Arena Trap") && MoveProcessor.IsInAreaRange(3, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)
                && !CheckStatusProtection(setup.Defender, setup.DefenderMap, "Immobilize", false, setup.PacketStack)
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (IsGroundImmune(setup.Defender, setup.DefenderMap)) {

                } else {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Arena Trap prevented escape!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    AddExtraStatus(setup.Defender, setup.DefenderMap, "Immobilize", 2, null, "", setup.PacketStack);
                }
            }

            if (HasAbility(setup.Defender, "Color Change") && setup.Move.MoveCategory != Enums.MoveCategory.Status && setup.Move.Element != Enums.PokemonType.None
                && (setup.Move.Element != setup.Defender.Type1 && setup.Defender.Type1 != Enums.PokemonType.None || setup.Move.Element != setup.Defender.Type2 && setup.Defender.Type2 != Enums.PokemonType.None)) {
                AddExtraStatus(setup.Defender, setup.DefenderMap, "Type1", (int)setup.Move.Element, null, "", setup.PacketStack);
                AddExtraStatus(setup.Defender, setup.DefenderMap, "Type2", 0, null, "", setup.PacketStack);
            }

            if (HasAbility(setup.Defender, "Cursed Body") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (Server.Math.Rand(0, 5) == 0 && setup.moveSlot > -1 && setup.moveSlot < 4) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Cursed Body sealed a move!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "MoveSeal:" + setup.moveSlot, 0, null, "", setup.PacketStack);
                }
            }
            if (HasAbility(setup.Defender, "Cute Charm") && setup.Move.MoveCategory != Enums.MoveCategory.Status
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (setup.Attacker.Sex == Enums.Sex.Genderless && setup.Defender.Sex == Enums.Sex.Genderless
                    || setup.Attacker.Sex == Enums.Sex.Male && setup.Defender.Sex == Enums.Sex.Female
                    || setup.Defender.Sex == Enums.Sex.Male && setup.Attacker.Sex == Enums.Sex.Female) {
                    if (Server.Math.Rand(0, 5) == 0 && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                        setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Cute Charm caused infatuation!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                        AddExtraStatus(setup.Attacker, setup.AttackerMap, "Attract", Server.Math.Rand(3, 5), null, "", setup.PacketStack);
                    }
                }
            }

            if (HasAbility(setup.Defender, "Effect Spore") && setup.Move.MoveCategory != Enums.MoveCategory.Status
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (Server.Math.Rand(0, 5) == 0 && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Effect Spore caused status problems!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    Enums.StatusAilment status = (Enums.StatusAilment)Server.Math.Rand(3, 6);
                    if (status == Enums.StatusAilment.Sleep) {
                        SetStatusAilment(setup.Attacker, setup.AttackerMap, status, Server.Math.Rand(2, 4), setup.PacketStack);
                    } else {
                        SetStatusAilment(setup.Attacker, setup.AttackerMap, status, 1, setup.PacketStack);
                    }
                }
            }
            if (HasActiveBagItem(setup.Defender, 22, 0, 0) && setup.Move.MoveCategory != Enums.MoveCategory.Status
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) { // Exclusive-item with Effect Spore action
                if (Server.Math.Rand(0, 5) == 0 && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s item caused status problems!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    Enums.StatusAilment status = (Enums.StatusAilment)Server.Math.Rand(3, 6);
                    if (status == Enums.StatusAilment.Sleep) {
                        SetStatusAilment(setup.Attacker, setup.AttackerMap, status, Server.Math.Rand(2, 4), setup.PacketStack);
                    } else {
                        SetStatusAilment(setup.Attacker, setup.AttackerMap, status, 1, setup.PacketStack);
                    }
                }
            }

            if (HasAbility(setup.Defender, "Flame Body") && setup.Move.MoveCategory != Enums.MoveCategory.Status
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (Server.Math.Rand(0, 5) == 0 && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Flame Body caused a burn!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Burn, 1, setup.PacketStack);
                }
            }
            if (HasAbility(setup.Defender, "Iron Barbs") && setup.Move.MoveCategory != Enums.MoveCategory.Status && !HasAbility(setup.Attacker, "Magic Guard")
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Iron Barbs hurt to touch!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    int dmg = setup.Attacker.MaxHP / 16;
                    if (setup.Attacker.MaxHP / 16 >= setup.Attacker.HP) {
                        DamageCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP / 16, Enums.KillType.Other, setup.PacketStack, true);
                        setup.Cancel = true;
                    } else {
                        DamageCharacter(setup.Attacker, setup.AttackerMap, setup.Attacker.MaxHP / 16, Enums.KillType.Other, setup.PacketStack, true);
                    }
                }
            }
            if (HasAbility(setup.Defender, "Justified") && setup.Move.Element == Enums.PokemonType.Dark && setup.Move.MoveCategory != Enums.MoveCategory.Status) {
                ChangeAttackBuff(setup.Defender, setup.DefenderMap, 1, setup.PacketStack);
            }

            if (HasAbility(setup.Defender, "Magnet Pull")/* && (setup.Defender.HP > 0 || !setup.KnockedOut)*/ && MoveProcessor.IsInAreaRange(3, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)
                && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, "Immobilize", false, setup.PacketStack)
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (setup.Attacker.Type1 == Enums.PokemonType.Steel || setup.Attacker.Type2 == Enums.PokemonType.Steel) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Magnet Pull prevented escape!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    AddExtraStatus(setup.Attacker, setup.AttackerMap, "Immobilize", 2, null, "", setup.PacketStack);
                }
            }
            if (HasAbility(setup.Attacker, "Magnet Pull") && MoveProcessor.IsInAreaRange(3, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)
                && !CheckStatusProtection(setup.Defender, setup.DefenderMap, "Immobilize", false, setup.PacketStack)
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (setup.Defender.Type1 == Enums.PokemonType.Steel || setup.Defender.Type2 == Enums.PokemonType.Steel) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Magnet Pull prevented escape!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    AddExtraStatus(setup.Defender, setup.DefenderMap, "Immobilize", 2, null, "", setup.PacketStack);
                }
            }
            if (HasAbility(setup.Defender, "Moody") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (Server.Math.Rand(0, 3) == 0) {
                    switch (Server.Math.Rand(0, 7)) {
                        case 0: {
                                ChangeAttackBuff(setup.Defender, setup.DefenderMap, -1, setup.PacketStack);
                            }
                            break;
                        case 1: {
                                ChangeDefenseBuff(setup.Defender, setup.DefenderMap, -1, setup.PacketStack);
                            }
                            break;
                        case 2: {
                                ChangeSpAtkBuff(setup.Defender, setup.DefenderMap, -1, setup.PacketStack);
                            }
                            break;
                        case 3: {
                                ChangeSpDefBuff(setup.Defender, setup.DefenderMap, -1, setup.PacketStack);
                            }
                            break;
                        case 4: {
                                ChangeSpeedBuff(setup.Defender, setup.DefenderMap, -1, setup.PacketStack);
                            }
                            break;
                        case 5: {
                                ChangeAccuracyBuff(setup.Defender, setup.DefenderMap, -1, setup.PacketStack);
                            }
                            break;
                        case 6: {
                                ChangeEvasionBuff(setup.Defender, setup.DefenderMap, -1, setup.PacketStack);
                            }
                            break;
                    }

                    switch (Server.Math.Rand(0, 7)) {
                        case 0: {
                                ChangeAttackBuff(setup.Defender, setup.DefenderMap, 2, setup.PacketStack);
                            }
                            break;
                        case 1: {
                                ChangeDefenseBuff(setup.Defender, setup.DefenderMap, 2, setup.PacketStack);
                            }
                            break;
                        case 2: {
                                ChangeSpAtkBuff(setup.Defender, setup.DefenderMap, 2, setup.PacketStack);
                            }
                            break;
                        case 3: {
                                ChangeSpDefBuff(setup.Defender, setup.DefenderMap, 2, setup.PacketStack);
                            }
                            break;
                        case 4: {
                                ChangeSpeedBuff(setup.Defender, setup.DefenderMap, 2, setup.PacketStack);
                            }
                            break;
                        case 5: {
                                ChangeAccuracyBuff(setup.Defender, setup.DefenderMap, 2, setup.PacketStack);
                            }
                            break;
                        case 6: {
                                ChangeEvasionBuff(setup.Defender, setup.DefenderMap, 2, setup.PacketStack);
                            }
                            break;
                    }
                }
            }

            if (HasAbility(setup.Attacker, "Mummy") && !HasAbility(setup.Defender, "Mummy") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) != Enums.CharacterMatchup.Self
                 && MoveProcessor.IsInAreaRange(1, setup.Attacker.X, setup.Attacker.Y, setup.Defender.X, setup.Defender.Y)) {
                AddExtraStatus(setup.Defender, setup.Attacker, setup.AttackerMap, "Ability1", 0, null, "Mummy", setup.PacketStack, true);
                AddExtraStatus(setup.Defender, setup.Attacker, setup.AttackerMap, "Ability2", 0, null, "None", setup.PacketStack, false);
                AddExtraStatus(setup.Defender, setup.Attacker, setup.AttackerMap, "Ability3", 0, null, "None", setup.PacketStack, false);
            }
            if (HasAbility(setup.Defender, "Mummy") && !HasAbility(setup.Attacker, "Mummy") && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) != Enums.CharacterMatchup.Self
                 && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                AddExtraStatus(setup.Attacker, setup.Defender, setup.DefenderMap, "Ability1", 0, null, "Mummy", setup.PacketStack, true);
                AddExtraStatus(setup.Attacker, setup.Defender, setup.DefenderMap, "Ability2", 0, null, "None", setup.PacketStack, false);
                AddExtraStatus(setup.Attacker, setup.Defender, setup.DefenderMap, "Ability3", 0, null, "None", setup.PacketStack, false);
            }

            if (HasAbility(setup.Defender, "Poison Point") && setup.Move.MoveCategory != Enums.MoveCategory.Status
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (Server.Math.Rand(0, 5) == 0 && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Poison Point caused poisoning!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Poison, 1, setup.PacketStack);
                }
            }
            if (HasAbility(setup.Defender, "Rattled")
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (setup.Move.Element == Enums.PokemonType.Dark || setup.Move.Element == Enums.PokemonType.Bug || setup.Move.Element == Enums.PokemonType.Ghost) {
                    ChangeSpeedBuff(setup.Defender, setup.DefenderMap, 1, setup.PacketStack);
                }
            }
            if (HasAbility(setup.Defender, "Rough Skin") && setup.Move.MoveCategory != Enums.MoveCategory.Status && !HasAbility(setup.Attacker, "Magic Guard")
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Rough Skin hurts to touch!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    int dmg = setup.Attacker.MaxHP / 32;
                    if (dmg >= setup.Attacker.HP) {
                        DamageCharacter(setup.Attacker, setup.AttackerMap, dmg, Enums.KillType.Other, setup.PacketStack, true);
                        setup.Cancel = true;
                    } else {
                        DamageCharacter(setup.Attacker, setup.AttackerMap, dmg, Enums.KillType.Other, setup.PacketStack, true);
                    }
                }
            }
            if (HasAbility(setup.Defender, "Shadow Tag")/* && (setup.Defender.HP > 0 || !setup.KnockedOut)*/ && MoveProcessor.IsInAreaRange(3, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)
                && !HasAbility(setup.Attacker, "Shadow Tag")
                && !CheckStatusProtection(setup.Attacker, setup.AttackerMap, "Immobilize", false, setup.PacketStack)
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Shadow Tag prevented escape!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                AddExtraStatus(setup.Attacker, setup.AttackerMap, "Immobilize", 2, null, "", setup.PacketStack);

            }
            if (HasAbility(setup.Attacker, "Shadow Tag") && MoveProcessor.IsInAreaRange(3, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)
                && !HasAbility(setup.Defender, "Shadow Tag")
                && !CheckStatusProtection(setup.Defender, setup.DefenderMap, "Immobilize", false, setup.PacketStack)
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + "'s Shadow Tag prevented escape!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                AddExtraStatus(setup.Defender, setup.DefenderMap, "Immobilize", 2, null, "", setup.PacketStack);

            }
            if (HasAbility(setup.Defender, "Static") && setup.Move.MoveCategory != Enums.MoveCategory.Status
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) == Enums.CharacterMatchup.Foe) {
                if (Server.Math.Rand(0, 5) == 0 && MoveProcessor.IsInAreaRange(1, setup.Defender.X, setup.Defender.Y, setup.Attacker.X, setup.Attacker.Y)) {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Static caused paralysis!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                    SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.Paralyze, 1, setup.PacketStack);
                }
            }

            if (HasAbility(setup.Defender, "Trace")
                && MoveProcessor.GetMatchupWith(setup.Attacker, setup.Defender) != Enums.CharacterMatchup.Self) {
                string ability = "None";
                switch (Server.Math.Rand(0,3)) {
                    case 0: {
                        ability = setup.Attacker.Ability1;
                    }
                    break;
                    case 1: {
                        ability = setup.Attacker.Ability2;
                    }
                    break;
                    case 2: {
                        ability = setup.Attacker.Ability3;
                    }
                    break;
                }
                if (setup.Defender.Ability1 == "Trace" && ability != "None") {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " traced an ability!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                    AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability1", 0, null, ability, setup.PacketStack, true);
                }
                if (setup.Defender.Ability2 == "Trace" && ability != "None") {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " traced an ability!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                    AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability2", 0, null, ability, setup.PacketStack, true);
                }
                if (setup.Defender.Ability3 == "Trace" && ability != "None") {
                    setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + " traced an ability!", Text.WhiteSmoke), setup.Defender.X, setup.Defender.Y, 10);
                    AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability3", 0, null, ability, setup.PacketStack, true);
                }
                /*
                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability1", 0, null, setup.Attacker.Ability1, setup.PacketStack, true);
                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability2", 0, null, setup.Attacker.Ability2, setup.PacketStack, true);
                AddExtraStatus(setup.Defender, setup.Attacker, setup.DefenderMap, "Ability3", 0, null, setup.Attacker.Ability3, setup.PacketStack, true);
                */
            }

            if (HasAbility(setup.Defender, "Weak Armor") && setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                setup.PacketStack.AddPacketToMap(setup.DefenderMap, PacketBuilder.CreateBattleMsg(setup.Defender.Name + "'s Weak Armor broke off!", Text.BrightRed), setup.Defender.X, setup.Defender.Y, 10);
                ChangeDefenseBuff(setup.Defender, setup.DefenderMap, -1, setup.PacketStack);
                ChangeSpeedBuff(setup.Defender, setup.DefenderMap, 2, setup.PacketStack);
            }

            if (HasActiveBagItem(setup.Defender, 51, 0, 0)) {  // Exclusive-item with Conversion2 Effect
                AddExtraStatus(setup.Defender, setup.DefenderMap, "Conversion2", 0, null, "", setup.PacketStack);
            }
        }
示例#29
0
        public static void AfterMoveExecuted(BattleSetup setup)
        {
            int point = 0;
            try {
                ExtraStatus status;

                if (setup.AttackerMap.TempStatus.GetStatus("Gravity") != null) {
                    if (setup.moveIndex == 73 || setup.moveIndex == 423 ||
                        setup.moveIndex == 380 || setup.moveIndex == 197 ||
                        setup.moveIndex == 338 || setup.moveIndex == 339 ||
                        setup.moveIndex == 610 || setup.moveIndex == 640) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But "+setup.Attacker.Name+"'s move failed due to gravity!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.Cancel = true;
                    return;
                    }
                }

                if (setup.Move.AdditionalEffectData1 == 224 && setup.Attacker.VolatileStatus.GetStatus("AteBerry") == null)
                {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But "+setup.Attacker.Name+" hasn't eaten a berry yet!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.Cancel = true;
                    return;
                }

                if (setup.Move.AdditionalEffectData1 == 35 && setup.Attacker.StatusAilment != Enums.StatusAilment.Sleep) {
                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But "+setup.Attacker.Name+" wasn't asleep!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                    setup.Cancel = true;
                    return;
                }

                if (setup.AttackerMap.TempStatus.GetStatus("WonderRoom") != null) {
                    if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                        setup.Move.MoveCategory = Enums.MoveCategory.Special;
                    } else if (setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                        setup.Move.MoveCategory = Enums.MoveCategory.Physical;
                    }
                }

                //use the correct attack/sp.attack stats
                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                    //proxy attack
                    status = setup.Attacker.VolatileStatus.GetStatus("ProxyAttack");
                    if (status != null) {
                        setup.AttackStat = status.Counter;
                    } else {
                        setup.AttackStat = setup.Attacker.Atk;
                    }
                } else if (setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                //proxy special
                    status = setup.Attacker.VolatileStatus.GetStatus("ProxySpAtk");
                    if (status != null) {
                        setup.AttackStat = status.Counter;
                    } else {
                        setup.AttackStat = setup.Attacker.SpclAtk;
                    }
                }

                status = setup.Attacker.VolatileStatus.GetStatus("Shocker");
                if (status != null) {
                    switch (setup.Move.TargetType) {
                        case Enums.MoveTarget.Foes:
                        case Enums.MoveTarget.AllAlliesButUser: {
                                setup.Move.TargetType = Enums.MoveTarget.AllButUser;
                            } break;
                        case Enums.MoveTarget.UserAndFoe:
                        case Enums.MoveTarget.UserAndAllies: {
                                setup.Move.TargetType = Enums.MoveTarget.All;
                            } break;
                    }
                }

                status = setup.Attacker.VolatileStatus.GetStatus("Longtoss");
                if (status != null) {
                    if (setup.Move.RangeType == Enums.MoveRange.LineUntilHit ||
                        setup.Move.RangeType == Enums.MoveRange.FrontOfUserUntil ||
                        setup.Move.RangeType == Enums.MoveRange.ArcThrow) {
                        setup.Move.Range = 50;
                    }
                }

                status = setup.Attacker.VolatileStatus.GetStatus("Pierce");
                if (status != null || setup.Attacker.HasActiveItem(699)) {
                    if (setup.Move.RangeType == Enums.MoveRange.LineUntilHit ||
                        setup.Move.RangeType == Enums.MoveRange.FrontOfUserUntil) {
                        setup.Move.RangeType = Enums.MoveRange.FrontOfUser;
                    }
                }

                //attacker-based move modification
                if (setup.Move.EffectType == Enums.MoveType.Scripted) {
                    switch (setup.Move.Data1) {
                        case 64: {//curse
                                if (setup.Attacker.Type1 == Enums.PokemonType.Ghost ||
                                    setup.Attacker.Type2 == Enums.PokemonType.Ghost) {
                                    setup.Move.RangeType = Enums.MoveRange.FrontOfUser;
                                    setup.Move.TargetType = Enums.MoveTarget.Foes;
                                    setup.Move.TravelingAnim.AnimationIndex = 77;
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateSoundPacket("magic3.wav"), setup.Attacker.X, setup.Attacker.Y, 10);
                                    int curseDmg = setup.Attacker.HP / 4;
                                    DamageCharacter(setup.Attacker, setup.AttackerMap, curseDmg, Enums.KillType.Other, setup.PacketStack, true);
                                    if (curseDmg < 1) curseDmg = 1;
                                    setup.BattleTags.Add("Curse:" + curseDmg);
                                }
                            }
                            break;
                        case 75: {//present
                                int rand = Server.Math.Rand(0, 4);
                                setup.BattleTags.Add("Present:" + rand);
                            }
                            break;
                        case 88: {//teleport
                                IMap warpMap = setup.AttackerMap;

                                for (int i = 1; i <= 500; i++) {
                                    int X = Server.Math.Rand(0, warpMap.MaxX + 1);
                                    int Y = Server.Math.Rand(0, warpMap.MaxY + 1);

                                    // Check if the tile is walkable
                                    if (X >= 0 && X <= warpMap.MaxX && Y >= 0 && Y <= warpMap.MaxY && warpMap.Tile[X, Y].Type == Enums.TileType.Walkable) {
                                        setup.BattleTags.Add("Teleport:" + X + ":" + Y);
                                        break;
                                    }
                                }
                            }
                            break;
                        case 129: {//psycho shift
                                int statusAilment = (int)setup.Attacker.StatusAilment;
                                int statusCounter = setup.Attacker.StatusAilmentCounter;
                                setup.BattleTags.Add("PsychoShift:" + statusAilment + ":" + statusCounter);
                                if (setup.Attacker.StatusAilment == Enums.StatusAilment.OK) {
                                    setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But " + setup.Attacker.Name + " didn't have a status problem to shift!", Text.WhiteSmoke), setup.Attacker.X, setup.Attacker.Y, 10);
                                } else {
                                    SetStatusAilment(setup.Attacker, setup.AttackerMap, Enums.StatusAilment.OK, 0, setup.PacketStack);
                                }
                            }
                            break;
                        case 159: {//ally switch
                                TargetCollection friendlyTargets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Floor, 0, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, false, true, false);
                                int size = friendlyTargets.Count;
                                string battleTag = setup.Attacker.X + ":" + setup.Attacker.Y;
                                for (int i = 0; i < friendlyTargets.Friends.Count; i++) {
                                    battleTag += ":" + friendlyTargets.Friends[i].X + ":" + friendlyTargets.Friends[i].Y;
                                }
                                setup.BattleTags.Add("AllySwitchCount:1");
                                setup.BattleTags.Add("AllySwitch:" + battleTag);

                            }
                            break;
                        case 162: {//rollcall
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg(setup.Attacker.Name + " called over everyone on the floor!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                setup.BattleTags.Add("Rollcall:" + setup.Attacker.X + ":" + setup.Attacker.Y);
                            }
                            break;
                        case 190: {//copy move
                                switch (setup.Move.Data2) {
                                    case 2: {// assist
                                            TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Floor, 0, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, false, true, false);
                                            List<int> moveNums = new List<int>();
                                            for (int i = 0; i < targets.Friends.Count; i++) {
                                                for (int j = 0; j < Constants.MAX_PLAYER_MOVES; j++) {
                                                    if (targets.Friends[i].Moves[j].MoveNum > 0 && !moveNums.Contains(targets.Friends[i].Moves[j].MoveNum)) {
                                                        moveNums.Add(targets.Friends[i].Moves[j].MoveNum);
                                                    }
                                                }
                                            }
                                            string tag = "Assist:";
                                            if (moveNums.Count > 0) {
                                                tag += moveNums[0];
                                            } else {
                                                tag += "0";
                                            }
                                            for (int i = 1; i < moveNums.Count; i++) {
                                                tag += ("," + moveNums[i]);
                                            }
                                            setup.BattleTags.Add(tag);
                                        }
                                        break;
                                    case 3: {//me first
                                            TargetCollection targets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Floor, 0, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, true, false, false);
                                            List<int> moveNums = new List<int>();
                                            for (int i = 0; i < targets.Foes.Count; i++) {
                                                for (int j = 0; j < Constants.MAX_PLAYER_MOVES; j++) {
                                                    if (targets.Foes[i].Moves[j].MoveNum > 0 && !moveNums.Contains(targets.Foes[i].Moves[j].MoveNum)) {
                                                        moveNums.Add(targets.Foes[i].Moves[j].MoveNum);
                                                    }
                                                }
                                            }
                                            string tag = "MeFirst:";
                                            if (moveNums.Count > 0) {
                                                tag += moveNums[0];
                                            } else {
                                                tag += "0";
                                            }
                                            for (int i = 1; i < moveNums.Count; i++) {
                                                tag += ("," + moveNums[i]);
                                            }
                                            setup.BattleTags.Add(tag);
                                        }
                                        break;

                                }
                            }
                            break;
                        case 195: {//pounce
                                setup.BattleTags.Add("Pounce:" + setup.Attacker.X + ":" + setup.Attacker.Y);
                            }
                            break;
                    }
                }
                                            point = 1;

                switch (setup.Move.AdditionalEffectData1) {
                    case 32: {//HP damage
                            setup.Move.Data1 *= setup.Attacker.HP;
                            setup.Move.Data1 /= setup.Attacker.MaxHP;
                        }
                        break;
                    case 33: {//Reverse HP damage
                            int n = setup.Attacker.HP * 64 / setup.Attacker.MaxHP;
                            if (n > 42) {
                                setup.Move.Data1 = 20;
                            } else if (n > 42) {
                                setup.Move.Data1 = 40;
                            } else if (n > 21) {
                                setup.Move.Data1 = 80;
                            } else if (n > 5) {
                                setup.Move.Data1 = 100;
                            } else if (n > 1) {
                                setup.Move.Data1 = 150;
                            } else {
                                setup.Move.Data1 = 200;
                            }
                        }
                        break;
                    case 62: {//rolling damage
                            if (setup.Attacker.VolatileStatus.GetStatus("DefenseCurl") != null) {
                                setup.Move.Data1 *= 2;
                            }
                            status = setup.Attacker.VolatileStatus.GetStatus("Rolling");
                            if (status != null) {
                                setup.Move.Data1 *= (int)System.Math.Pow(2, status.Counter);
                            }
                        }
                        break;
                    case 63: {//fury cutter damage
                        status = setup.Attacker.VolatileStatus.GetStatus("FuryCutter");
                            if (status != null) {
                                setup.Move.Data1 *= (int)System.Math.Pow(2, status.Counter);
                            }
                        }
                        break;
                    case 70: {//spit up
                        status = setup.Attacker.VolatileStatus.GetStatus("Stockpile");
                            if (status == null) {
                                setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("But there was nothing to spit up!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                                setup.AttackerMultiplier = 0;
                            } else {
                                setup.Move.Data1 = 100 * status.Counter;
                            }
                        }
                        break;
                    case 72: {//magnitude
                            int rand = Server.Math.Rand(4, 11);
                            setup.PacketStack.AddPacketToMap(setup.AttackerMap, PacketBuilder.CreateBattleMsg("It's magnitude " + rand + "!", Text.BrightRed), setup.Attacker.X, setup.Attacker.Y, 10);
                            switch (rand) {
                                case 4: {
                                        setup.Move.Data1 = 10;
                                    }
                                    break;
                                case 5: {
                                        setup.Move.Data1 = 30;
                                    }
                                    break;
                                case 6: {
                                        setup.Move.Data1 = 50;
                                    }
                                    break;
                                case 7: {
                                        setup.Move.Data1 = 70;
                                    }
                                    break;
                                case 8: {
                                        setup.Move.Data1 = 90;
                                    }
                                    break;
                                case 9: {
                                        setup.Move.Data1 = 110;
                                    }
                                    break;
                                case 10: {
                                        setup.Move.Data1 = 150;
                                    }
                                    break;
                            }
                        }
                        break;
                    case 76: {//Trump Card
                            setup.Move.Data1 = 50;
                            if (setup.moveSlot > -1 && setup.moveSlot < 4) {
                                switch (setup.Attacker.Moves[setup.moveSlot].CurrentPP) {
                                    case 3: {
                                            setup.Move.Data1 = 50;
                                        }
                                        break;
                                    case 2: {
                                            setup.Move.Data1 = 60;
                                        }
                                        break;
                                    case 1: {
                                            setup.Move.Data1 = 80;
                                        }
                                        break;
                                    case 0: {
                                            setup.Move.Data1 = 200;
                                        }
                                        break;
                                    case 4: {
                                            setup.Move.Data1 = 40;
                                        }
                                        break;
                                }
                            }
                        }
                        break;
                    case 82: {//Weather Ball
                            switch (GetCharacterWeather(setup.Attacker)) {
                                case Enums.Weather.Raining:
                                case Enums.Weather.Thunder: {
                                        setup.Move.Data1 *= 2;
                                        setup.Move.Element = Enums.PokemonType.Water;
                                        setup.Move.TravelingAnim.AnimationIndex = 15;
                                        setup.Move.DefenderAnim.AnimationIndex = 71;
                                    }
                                    break;
                                case Enums.Weather.Snowing:
                                case Enums.Weather.Snowstorm:
                                case Enums.Weather.Hail: {
                                        setup.Move.Data1 *= 2;
                                        setup.Move.Element = Enums.PokemonType.Ice;
                                        setup.Move.TravelingAnim.AnimationIndex = 410;
                                        setup.Move.DefenderAnim.AnimationIndex = 10;
                                    }
                                    break;
                                case Enums.Weather.DiamondDust: {
                                        setup.Move.Data1 *= 2;
                                        setup.Move.Element = Enums.PokemonType.Normal;
                                        setup.Move.DefenderAnim.AnimationIndex = 72;
                                    }
                                    break;
                                case Enums.Weather.Cloudy:
                                case Enums.Weather.Fog: {
                                        setup.Move.Data1 *= 2;
                                        setup.Move.Element = Enums.PokemonType.Normal;
                                    }
                                    break;
                                case Enums.Weather.Sunny: {
                                        setup.Move.Data1 *= 2;
                                        setup.Move.Element = Enums.PokemonType.Fire;
                                        setup.Move.TravelingAnim.AnimationIndex = 35;
                                        setup.Move.DefenderAnim.AnimationIndex = 20;
                                    }
                                    break;
                                case Enums.Weather.Sandstorm:
                                case Enums.Weather.Ashfall: {
                                        setup.Move.Data1 *= 2;
                                        setup.Move.Element = Enums.PokemonType.Rock;
                                        setup.Move.TravelingAnim.AnimationIndex = 412;
                                        setup.Move.DefenderAnim.AnimationIndex = 14;
                                    }
                                    break;

                            }
                        }
                        break;
                    case 83: {//facade
                            if (setup.Attacker.StatusAilment != Enums.StatusAilment.OK) {
                                setup.Move.Data1 *= 2;
                            }
                        }
                        break;
                    case 126: {//last resort
                            int lostMoves = 0;

                            for (int i = 0; i < Constants.MAX_PLAYER_MOVES; i++) {
                                if (setup.Attacker.Moves[i].CurrentPP == 0) lostMoves++;
                            }
                            if (lostMoves == 0) {
                                setup.AttackerMultiplier = 0;
                            } else {
                                setup.Move.Data1 *= lostMoves;
                            }
                        }
                        break;
                    case 154: {//acrobatics
                            if (setup.Attacker.HeldItem == null) {
                                setup.Move.Data1 *= 2;
                            }
                        }
                        break;
                    case 160: {//round

                            if (GetBattleTagArg(setup.BattleTags, "Round", 0) != null) {
                                setup.Move.Data1 *= 2;
                            }

                            if (setup.Attacker.CharacterType == Enums.CharacterType.Recruit) {
                                if (!setup.BattleTags.Contains("Round:" + (int)setup.Attacker.CharacterType + ":" + ((Recruit)setup.Attacker).Owner.Player.CharID)) {
                                    setup.BattleTags.Add("Round:" + (int)setup.Attacker.CharacterType + ":" + ((Recruit)setup.Attacker).Owner.Player.CharID);
                                }
                            } else if (setup.Attacker.CharacterType == Enums.CharacterType.MapNpc) {
                                if (!setup.BattleTags.Contains("Round:" + (int)setup.Attacker.CharacterType + ":" + ((MapNpc)setup.Attacker).MapSlot)) {
                                    setup.BattleTags.Add("Round:" + (int)setup.Attacker.CharacterType + ":" + ((MapNpc)setup.Attacker).MapSlot);
                                }
                            }

                        }
                        break;
                    case 169: {//Stored Power
                            if (setup.Attacker.AttackBuff > 0) setup.Move.Data1 += (20 * setup.Attacker.AttackBuff);
                            if (setup.Attacker.DefenseBuff > 0) setup.Move.Data1 += (20 * setup.Attacker.DefenseBuff);
                            if (setup.Attacker.SpeedBuff > 0) setup.Move.Data1 += (20 * setup.Attacker.SpeedBuff);
                            if (setup.Attacker.SpAtkBuff > 0) setup.Move.Data1 += (20 * setup.Attacker.SpAtkBuff);
                            if (setup.Attacker.SpDefBuff > 0) setup.Move.Data1 += (20 * setup.Attacker.SpDefBuff);
                            if (setup.Attacker.AccuracyBuff > 0) setup.Move.Data1 += (20 * setup.Attacker.AccuracyBuff);
                            if (setup.Attacker.EvasionBuff > 0) setup.Move.Data1 += (20 * setup.Attacker.EvasionBuff);
                        }
                        break;
                    case 196: {//jump kick/hi jump kick
                            Pounce(setup.Attacker, setup.AttackerMap, setup.Attacker.Direction, true, false, setup.PacketStack);
                        }
                        break;
                    case 197: {//sky drop
                            if (GetBattleTagArg(setup.BattleTags, "SkyDrop", 0) == null) {
                                setup.Move.EffectType = Enums.MoveType.Scripted;
                                setup.Move.Data1 = 197;
                            } else {
                                setup.Move.Accuracy = -1;
                            }
                        }
                        break;
                    case 203: {//retaliate
                            if (setup.Attacker.VolatileStatus.GetStatus("SawAllyFaint") != null) {
                                setup.Move.Data1 *= 2;
                            }
                        }
                        break;
                    case 211: {//hidden power
                            int sum = 0;
                            int pwr = 60;
                            if (setup.AttackerMap.MapType == Enums.MapType.RDungeonMap) {
                                RDungeonMap rmap = setup.AttackerMap as RDungeonMap;
                                sum = (rmap.RDungeonIndex + rmap.RDungeonFloor) % 17 + 1;
                            } else {
                                sum = Server.Math.Rand(1, 18);
                            }
                            if (sum >= 13) sum++;
                            setup.Move.Element = (Enums.PokemonType)sum;
                            setup.Move.Data1 = pwr;
                        }
                        break;
                    case 217: {//natural gift
                            Enums.PokemonType berryType = Enums.PokemonType.Normal;
                            int pwr = 30;
                            int berryNum = -1;
                            if (setup.Attacker.HeldItem != null) berryNum = setup.Attacker.HeldItem.Num;
                            switch (berryNum) {
                                case 492: pwr += 30; berryType = Enums.PokemonType.Fire; break;
                                case 493: pwr += 30; berryType = Enums.PokemonType.Water; break;
                                case 4: pwr += 30; berryType = Enums.PokemonType.Poison; break;
                                case 524: pwr += 50; berryType = Enums.PokemonType.Grass; break;
                                case 74: pwr += 20; berryType = Enums.PokemonType.Poison; break;
                                case 222: pwr += 50; berryType = Enums.PokemonType.Bug; break;
                                case 86: pwr += 30; berryType = Enums.PokemonType.Fighting; break;
                                case 474: pwr += 40; berryType = Enums.PokemonType.Fighting; break;
                                case 475: pwr += 40; berryType = Enums.PokemonType.Poison; break;
                                case 476: pwr += 40; berryType = Enums.PokemonType.Psychic; break;
                                case 477: pwr += 40; berryType = Enums.PokemonType.Ground; break;
                                case 487: pwr += 30; berryType = Enums.PokemonType.Electric; break;
                                case 494: pwr += 30; berryType = Enums.PokemonType.Grass; break;
                                case 495: pwr += 30; berryType = Enums.PokemonType.Ice; break;
                                case 496: pwr += 30; berryType = Enums.PokemonType.Ground; break;
                                case 497: pwr += 30; berryType = Enums.PokemonType.Flying; break;
                                case 523: pwr += 50; berryType = Enums.PokemonType.Ground; break;
                                case 525: pwr += 50; berryType = Enums.PokemonType.Ice; break;
                                case 526: pwr += 50; berryType = Enums.PokemonType.Fighting; break;
                                case 527: pwr += 50; berryType = Enums.PokemonType.Poison; break;
                                case 528: pwr += 50; berryType = Enums.PokemonType.Psychic; break;
                                case 529: pwr += 50; berryType = Enums.PokemonType.Rock; break;
                                case 641: pwr += 30; berryType = Enums.PokemonType.Bug; break;
                                case 642: pwr += 30; berryType = Enums.PokemonType.Dark; break;
                                case 643: pwr += 30; berryType = Enums.PokemonType.Dragon; break;
                                case 644: pwr += 30; berryType = Enums.PokemonType.Electric; break;
                                case 645: pwr += 30; berryType = Enums.PokemonType.Fighting; break;
                                case 646: pwr += 30; berryType = Enums.PokemonType.Fire; break;
                                case 647: pwr += 30; berryType = Enums.PokemonType.Flying; break;
                                case 648: pwr += 30; berryType = Enums.PokemonType.Ghost; break;
                                case 649: pwr += 30; berryType = Enums.PokemonType.Grass; break;
                                case 650: pwr += 30; berryType = Enums.PokemonType.Ground; break;
                                case 651: pwr += 30; berryType = Enums.PokemonType.Ice; break;
                                case 652: pwr += 30; berryType = Enums.PokemonType.Normal; break;
                                case 653: pwr += 30; berryType = Enums.PokemonType.Poison; break;
                                case 654: pwr += 30; berryType = Enums.PokemonType.Psychic; break;
                                case 655: pwr += 30; berryType = Enums.PokemonType.Rock; break;
                                case 656: pwr += 30; berryType = Enums.PokemonType.Steel; break;
                                case 657: pwr += 30; berryType = Enums.PokemonType.Water; break;
                                case 767: pwr += 30; berryType = Enums.PokemonType.Bug; break;
                                case 768: pwr += 30; berryType = Enums.PokemonType.Rock; break;
                                case 769: pwr += 30; berryType = Enums.PokemonType.Ghost; break;
                                case 770: pwr += 30; berryType = Enums.PokemonType.Dragon; break;
                                case 771: pwr += 30; berryType = Enums.PokemonType.Dark; break;
                                case 772: pwr += 30; berryType = Enums.PokemonType.Steel; break;
                                case 773: pwr += 40; berryType = Enums.PokemonType.Fire; break;
                                case 774: pwr += 40; berryType = Enums.PokemonType.Water; break;
                                case 775: pwr += 40; berryType = Enums.PokemonType.Electric; break;
                                case 776: pwr += 40; berryType = Enums.PokemonType.Grass; break;
                                case 777: pwr += 40; berryType = Enums.PokemonType.Ice; break;
                                case 778: pwr += 40; berryType = Enums.PokemonType.Bug; break;
                                case 779: pwr += 40; berryType = Enums.PokemonType.Rock; break;
                                case 780: pwr += 40; berryType = Enums.PokemonType.Ghost; break;
                                case 781: pwr += 40; berryType = Enums.PokemonType.Flying; break;
                                case 782: pwr += 40; berryType = Enums.PokemonType.Dragon; break;
                                case 783: pwr += 40; berryType = Enums.PokemonType.Dark; break;
                                case 784: pwr += 40; berryType = Enums.PokemonType.Steel; break;
                                case 785: pwr += 50; berryType = Enums.PokemonType.Fire; break;
                                case 786: pwr += 50; berryType = Enums.PokemonType.Water; break;
                                case 787: pwr += 50; berryType = Enums.PokemonType.Electric; break;
                                case 788: pwr += 50; berryType = Enums.PokemonType.Flying; break;
                                case 789: pwr += 50; berryType = Enums.PokemonType.Dragon; break;
                                case 790: pwr += 50; berryType = Enums.PokemonType.Dark; break;
                                case 3: pwr += 60; berryType = Enums.PokemonType.Ice; break;
                                case 8: pwr += 30; berryType = Enums.PokemonType.Psychic; break;

                            }

                            setup.Move.Element = berryType;
                            setup.Move.Data1 = pwr;
                        }
                        break;
                }

                if (HasAbility(setup.Attacker, "Normalize")) {
                    setup.Move.Element = Enums.PokemonType.Normal;

                }

                //Refrigerate
                //Turns Normal type moves into Ice. Attack power becomes 1.3x.
                if (HasAbility(setup.Attacker, "Refrigerate")) {
                    if (setup.Move.Element == Enums.PokemonType.Normal){
                        setup.Move.Element = Enums.PokemonType.Ice;
                        setup.AttackerMultiplier *= 13;
                        setup.AttackerMultiplier /= 10;
                    }
                }

                //Pixilate
                //Turns Normal type moves into Fairy. Attack power becomes 1.3x.
                if (HasAbility(setup.Attacker, "Pixilate")) {
                    if (setup.Move.Element == Enums.PokemonType.Normal){
                        setup.Move.Element = Enums.PokemonType.Fairy;
                        setup.AttackerMultiplier *= 13;
                        setup.AttackerMultiplier /= 10;
                    }
                }

                //Aerilate
                //Turns Normal type moves into Flying. Attack power becomes 1.3x.
                if (HasAbility(setup.Attacker, "Aerilate")) {
                    if (setup.Move.Element == Enums.PokemonType.Normal){
                        setup.Move.Element = Enums.PokemonType.Flying;
                        setup.AttackerMultiplier *= 13;
                        setup.AttackerMultiplier /= 10;
                    }
                }

                //apply STAB
                if (setup.Move.EffectType == Enums.MoveType.SubHP && setup.Move.Element != Enums.PokemonType.None && (setup.Move.Element == setup.Attacker.Type1 || setup.Move.Element == setup.Attacker.Type2)) {
                    setup.AttackerMultiplier *= 5;
                    setup.AttackerMultiplier /= 4;
                }

                //apply Choice
                if (setup.Attacker.HasActiveItem(256) && setup.Move.MoveCategory == Enums.MoveCategory.Physical
                || setup.Attacker.HasActiveItem(257) && setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                    setup.AttackerMultiplier *= 3;
                    setup.AttackerMultiplier /= 2;
                }

                //apply life orb
                if (setup.Attacker.HasActiveItem(143)) {
                    setup.AttackerMultiplier *= 5;
                    setup.AttackerMultiplier /= 4;
                }

                //type-boosting items
                if (setup.Attacker.HasActiveItem(71) && setup.Move.Element == Enums.PokemonType.Bug
                || setup.Attacker.HasActiveItem(44) && setup.Move.Element == Enums.PokemonType.Dark
                || setup.Attacker.HasActiveItem(76) && setup.Move.Element == Enums.PokemonType.Dragon
                || setup.Attacker.HasActiveItem(83) && setup.Move.Element == Enums.PokemonType.Electric
                || setup.Attacker.HasActiveItem(58) && setup.Move.Element == Enums.PokemonType.Fighting
                || setup.Attacker.HasActiveItem(64) && setup.Move.Element == Enums.PokemonType.Fire
                || setup.Attacker.HasActiveItem(95) && setup.Move.Element == Enums.PokemonType.Flying
                || setup.Attacker.HasActiveItem(97) && setup.Move.Element == Enums.PokemonType.Ghost
                || setup.Attacker.HasActiveItem(100) && setup.Move.Element == Enums.PokemonType.Grass
                || setup.Attacker.HasActiveItem(67) && setup.Move.Element == Enums.PokemonType.Ground
                || setup.Attacker.HasActiveItem(106) && setup.Move.Element == Enums.PokemonType.Ice
                || setup.Attacker.HasActiveItem(399) && setup.Move.Element == Enums.PokemonType.Normal
                || setup.Attacker.HasActiveItem(122) && setup.Move.Element == Enums.PokemonType.Poison
                || setup.Attacker.HasActiveItem(107) && setup.Move.Element == Enums.PokemonType.Psychic
                || setup.Attacker.HasActiveItem(108) && setup.Move.Element == Enums.PokemonType.Rock
                || setup.Attacker.HasActiveItem(68) && setup.Move.Element == Enums.PokemonType.Steel
                || setup.Attacker.HasActiveItem(314) && setup.Move.Element == Enums.PokemonType.Water) {
                    setup.AttackerMultiplier *= 11;
                    setup.AttackerMultiplier /= 10;
                }

                //power boosting items

                //muscle band/wise glasses
                if (setup.Attacker.HasActiveItem(248) && setup.Move.MoveCategory == Enums.MoveCategory.Physical ||
                    setup.Attacker.HasActiveItem(249) && setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                    setup.AttackStat *= 11;
                    setup.AttackStat /= 10;
                }

                point = 2;

                status = setup.Attacker.VolatileStatus.GetStatus("TypeBoost");
                if (status != null && status.Counter == (int)setup.Move.Element) {
                    setup.AttackerMultiplier *= 3;
                    setup.AttackerMultiplier /= 2;
                }

                if (setup.Move.Element == Enums.PokemonType.Fire && setup.Attacker.VolatileStatus.GetStatus("FlashFire") != null) {
                    setup.AttackerMultiplier *= 4;
                    setup.AttackerMultiplier /= 3;
                }

                //Metronome (item)
                if (setup.Attacker.HasActiveItem(125)) {
                    status = setup.Attacker.VolatileStatus.GetStatus("TimesLastMoveUsed");
                    if (status != null) {
                        int repeats = status.Counter - 1;
                        if (repeats > 10) repeats = 10;
                        setup.AttackerMultiplier *= (100 + 8 * repeats);
                        setup.AttackerMultiplier /= 100;
                    }
                }
                point = 3;

                //wide lens
                if (setup.Attacker.HasActiveItem(175) && setup.Move.Accuracy != -1) {
                    setup.Move.Accuracy *= 11;
                    setup.Move.Accuracy /= 10;
                }

                //Charge
                if (setup.Move.Element == Enums.PokemonType.Electric && setup.Attacker.VolatileStatus.GetStatus("Charge") != null) {
                    setup.AttackerMultiplier *= 2;
                }

                //sure shot
                if (setup.Attacker.VolatileStatus.GetStatus("SureShot") != null) {
                    setup.Move.Accuracy = -1;
                }

                //attacker-based weather effects
                switch (GetCharacterWeather(setup.Attacker)) {
                    case Enums.Weather.Raining:
                    case Enums.Weather.Thunder: {
                            if (setup.Move.Element == Enums.PokemonType.Water) {
                                setup.AttackerMultiplier *= 5;
                                setup.AttackerMultiplier /= 4;
                            }
                            if (setup.Move.Element == Enums.PokemonType.Fire) {
                                setup.AttackerMultiplier /= 2;
                            }
                            if (setup.Move.AdditionalEffectData1 == 60 && setup.Move.AdditionalEffectData2 == 1) setup.AttackerMultiplier /= 2;
                        }
                        break;
                    case Enums.Weather.Snowing:
                    case Enums.Weather.Snowstorm: {
                            if (setup.Move.AdditionalEffectData1 == 60 && setup.Move.AdditionalEffectData2 == 1) setup.AttackerMultiplier /= 2;
                        }
                        break;
                    case Enums.Weather.Hail: {
                            if (setup.Move.AdditionalEffectData1 == 60 && setup.Move.AdditionalEffectData2 == 1) setup.AttackerMultiplier /= 2;
                        }
                        break;
                    case Enums.Weather.DiamondDust: {
                        }
                        break;
                    case Enums.Weather.Cloudy: {
                            if (setup.Move.Element != Enums.PokemonType.Normal) {
                                setup.AttackerMultiplier /= 2;
                            }
                            if (setup.Move.AdditionalEffectData1 == 60 && setup.Move.AdditionalEffectData2 == 1) setup.AttackerMultiplier /= 2;
                        }
                        break;
                    case Enums.Weather.Fog: {
                            if (setup.Move.AdditionalEffectData1 == 60 && setup.Move.AdditionalEffectData2 == 1) setup.AttackerMultiplier /= 2;
                        }
                        break;
                    case Enums.Weather.Sunny: {
                            if (setup.Move.Element == Enums.PokemonType.Fire) {
                                setup.AttackerMultiplier *= 5;
                                setup.AttackerMultiplier /= 4;
                            }
                            if (setup.Move.Element == Enums.PokemonType.Water) {
                                setup.AttackerMultiplier /= 2;
                            }
                        }
                        break;
                    case Enums.Weather.Sandstorm: {
                            if (setup.Move.AdditionalEffectData1 == 60 && setup.Move.AdditionalEffectData2 == 1) setup.AttackerMultiplier /= 2;
                        }
                        break;
                    case Enums.Weather.Ashfall: {
                            if (setup.Move.Element == Enums.PokemonType.Poison) {
                                setup.AttackerMultiplier *= 5;
                                setup.AttackerMultiplier /= 4;
                            }
                            if (setup.Move.Element == Enums.PokemonType.Electric) {
                                setup.AttackerMultiplier /= 2;
                            }
                            if (setup.Move.AdditionalEffectData1 == 60 && setup.Move.AdditionalEffectData2 == 1) setup.AttackerMultiplier /= 2;
                        }
                        break;

                }
                point = 4;

                //burn reduction
                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical && setup.Attacker.StatusAilment == Enums.StatusAilment.Burn) {
                    setup.AttackStat /= 2;
                }

                //check for attacker modifying abilities
                CheckAttackerModAbility(setup);

                point = 5;

                bool unaware = false;
                if (!HasAbility(setup.Attacker, "Mold Breaker")) {
                    TargetCollection abilityTargets = MoveProcessor.GetTargetsInRange(Enums.MoveRange.Room, 10, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, Enums.Direction.Up, true, false, false);
                    for (int i = 0; i < abilityTargets.Foes.Count; i++) {
                        if (HasAbility(abilityTargets.Foes[i], "Unaware")) {
                            unaware = true;
                            break;
                        }
                    }
                }
                if (setup.Move.MoveCategory == Enums.MoveCategory.Physical) {
                    if (unaware) {
                    } else {
                        setup.AttackStat = DamageCalculator.ApplyAttackBuff(setup.AttackStat, setup.Attacker.AttackBuff) / 256;
                    }
                } else if (setup.Move.MoveCategory == Enums.MoveCategory.Special) {
                    if (unaware) {
                    } else {
                        setup.AttackStat = DamageCalculator.ApplyAttackBuff(setup.AttackStat, setup.Attacker.SpAtkBuff) / 256;
                    }
                }
                point = 6;

                //pain split check
                if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 204) {
                    int health = setup.Attacker.HP;
                    TargetCollection checkedTargets = MoveProcessor.GetTargetsInRange(setup.Move.RangeType,
                    setup.Move.Range, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, setup.Attacker.Direction,
                    BattleProcessor.HitsFoes(setup.Move.TargetType), BattleProcessor.HitsAllies(setup.Move.TargetType), false);
                    for (int i = 0; i < checkedTargets.Count; i++) {
                        health += checkedTargets[i].HP;
                    }
                    health /= (checkedTargets.Count + 1);
                    setup.BattleTags.Add("PainSplit:" + health);
                }

                //stat split check
                if (setup.Move.EffectType == Enums.MoveType.Scripted && setup.Move.Data1 == 209) {
                    int stat = 0, special = 0;
                    if (setup.Move.Data2 == 1) {
                        stat = setup.Attacker.Atk;
                        special = setup.Attacker.SpclAtk;
                    } else if (setup.Move.Data2 == 2) {
                        stat = setup.Attacker.Def;
                        special = setup.Attacker.SpclDef;
                    }
                    TargetCollection checkedTargets = MoveProcessor.GetTargetsInRange(setup.Move.RangeType,
                    setup.Move.Range, setup.AttackerMap, setup.Attacker, setup.Attacker.X, setup.Attacker.Y, setup.Attacker.Direction,
                    BattleProcessor.HitsFoes(setup.Move.TargetType), BattleProcessor.HitsAllies(setup.Move.TargetType), false);
                    for (int i = 0; i < checkedTargets.Count; i++) {
                        if (setup.Move.Data2 == 1) {
                            stat += checkedTargets[i].Atk;
                            special += checkedTargets[i].SpclAtk;
                        } else if (setup.Move.Data2 == 2) {
                            stat += checkedTargets[i].Def;
                            special += checkedTargets[i].SpclDef;
                        }
                    }
                    stat /= (checkedTargets.Count + 1);
                    special /= (checkedTargets.Count + 1);
                    setup.BattleTags.Add("StatSplit:" + stat + ":" + special);
                }

            } catch (Exception ex) {
                Messenger.AdminMsg("Error: AfterMoveExecuted", Text.Black);
                Messenger.AdminMsg("Point: " + point, Text.Black);
            }
        }
示例#30
0
文件: MapNpc.cs 项目: pzaps/Server
        //public void UseMoveOnSelf(int moveNum) {
        //    BattleProcessor.MoveHitCharacter(this, this, moveNum);
        //    Messenger.SpellAnim(moveNum, this.MapID, this.X, this.Y);
        //}
        public void UseMove(int moveSlot)
        {
            BattleSetup setup = new BattleSetup();

            setup.Attacker = this;
            setup.moveSlot = moveSlot;

            BattleProcessor.HandleAttack(setup);

            BattleProcessor.FinalizeAction(setup);
        }