From 36841a8498134931be3d1c73927f6fec4482fb30 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sat, 6 Jan 2018 13:56:53 -0800 Subject: Decompile more battle_2 functions --- src/battle/battle_2.c | 1645 +++++++++++++++++++++++++++++++++++++++++++++++- src/battle/battle_ai.c | 4 +- 2 files changed, 1646 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index b0654950b..90d0d40e3 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -4,6 +4,7 @@ #include "battle_interface.h" #include "battle_setup.h" #include "data2.h" +#include "event_data.h" #include "item.h" #include "link.h" #include "main.h" @@ -26,9 +27,10 @@ #include "trig.h" #include "unknown_task.h" #include "util.h" +#include "constants/battle_move_effects.h" #include "constants/items.h" #include "constants/hold_effects.h" -#include "constants/battle_move_effects.h" +#include "constants/moves.h" #include "ewram.h" struct UnknownStruct7 @@ -56,6 +58,8 @@ struct UnknownStruct12 extern const u16 gUnknown_08D004E0[]; extern const struct MonCoords gCastformFrontSpriteCoords[]; +extern u8 gStatStageRatios[][2]; +extern u8 gUnknown_02024A76[4]; extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; extern u8 gBattleBufferB[][0x200]; extern u8 gActiveBank; @@ -2352,3 +2356,1642 @@ void sub_8012324(void) } } */ +__attribute__((naked)) +void sub_8012324(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x1C\n\ + ldr r0, _08012340 @ =gBattleCommunication\n\ + movs r1, 0\n\ + strb r1, [r0, 0x4]\n\ + ldr r0, _08012344 @ =gActiveBank\n\ + strb r1, [r0]\n\ + ldr r0, _08012348 @ =gNoOfAllBanks\n\ + bl _08012F74\n\ + .align 2, 0\n\ +_08012340: .4byte gBattleCommunication\n\ +_08012344: .4byte gActiveBank\n\ +_08012348: .4byte gNoOfAllBanks\n\ +_0801234C:\n\ + ldr r4, _08012374 @ =gActiveBank\n\ + ldrb r0, [r4]\n\ + bl GetBankIdentity\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r1, _08012378 @ =gBattleCommunication\n\ + ldrb r0, [r4]\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x6\n\ + bls _08012368\n\ + bl _08012F66\n\ +_08012368:\n\ + lsls r0, 2\n\ + ldr r1, _0801237C @ =_08012380\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08012374: .4byte gActiveBank\n\ +_08012378: .4byte gBattleCommunication\n\ +_0801237C: .4byte _08012380\n\ + .align 2, 0\n\ +_08012380:\n\ + .4byte _0801239C\n\ + .4byte _080124C8\n\ + .4byte _08012A28\n\ + .4byte _08012DA8\n\ + .4byte _08012E50\n\ + .4byte _08012E94\n\ + .4byte _08012F38\n\ +_0801239C:\n\ + ldr r4, _08012434 @ =gSharedMem\n\ + ldr r0, _08012438 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + ldr r1, _0801243C @ =0x00016068\n\ + adds r0, r1\n\ + adds r0, r4\n\ + movs r1, 0x6\n\ + strb r1, [r0]\n\ + ldr r0, _08012440 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080123F8\n\ + movs r1, 0x2\n\ + movs r0, 0x2\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _080123F8\n\ + eors r5, r1\n\ + adds r0, r5, 0\n\ + bl GetBankByPlayerAI\n\ + ldr r2, _08012444 @ =0x000160a6\n\ + adds r1, r4, r2\n\ + ldrb r1, [r1]\n\ + ldr r2, _08012448 @ =gBitTable\n\ + lsls r0, 24\n\ + lsrs r0, 22\n\ + adds r0, r2\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _080123F8\n\ + ldr r4, _0801244C @ =gBattleCommunication\n\ + adds r0, r5, 0\n\ + bl GetBankByPlayerAI\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r0, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x4\n\ + beq _080123F8\n\ + bl _08012F66\n\ +_080123F8:\n\ + ldr r0, _08012434 @ =gSharedMem\n\ + ldr r3, _08012444 @ =0x000160a6\n\ + adds r0, r3\n\ + ldrb r3, [r0]\n\ + ldr r1, _08012448 @ =gBitTable\n\ + ldr r4, _08012438 @ =gActiveBank\n\ + ldrb r2, [r4]\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ands r3, r0\n\ + cmp r3, 0\n\ + beq _08012468\n\ + ldr r0, _08012450 @ =gActionForBanks\n\ + adds r0, r2, r0\n\ + movs r1, 0xD\n\ + strb r1, [r0]\n\ + ldr r0, _08012440 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012454\n\ + ldr r0, _0801244C @ =gBattleCommunication\n\ + ldrb r1, [r4]\n\ + adds r1, r0\n\ + movs r0, 0x4\n\ + strb r0, [r1]\n\ + bl _08012F66\n\ + .align 2, 0\n\ +_08012434: .4byte gSharedMem\n\ +_08012438: .4byte gActiveBank\n\ +_0801243C: .4byte 0x00016068\n\ +_08012440: .4byte gBattleTypeFlags\n\ +_08012444: .4byte 0x000160a6\n\ +_08012448: .4byte gBitTable\n\ +_0801244C: .4byte gBattleCommunication\n\ +_08012450: .4byte gActionForBanks\n\ +_08012454:\n\ + ldr r0, _08012464 @ =gBattleCommunication\n\ + ldrb r1, [r4]\n\ + adds r1, r0\n\ + movs r0, 0x3\n\ + strb r0, [r1]\n\ + bl _08012F66\n\ + .align 2, 0\n\ +_08012464: .4byte gBattleCommunication\n\ +_08012468:\n\ + ldr r1, _0801249C @ =gBattleMons\n\ + movs r0, 0x58\n\ + muls r0, r2\n\ + adds r1, 0x50\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012488\n\ + movs r0, 0x80\n\ + lsls r0, 15\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _080124A8\n\ +_08012488:\n\ + ldr r0, _080124A0 @ =gActionForBanks\n\ + adds r0, r2, r0\n\ + strb r3, [r0]\n\ + ldr r1, _080124A4 @ =gBattleCommunication\n\ + ldrb r0, [r4]\n\ + adds r0, r1\n\ + movs r1, 0x3\n\ + strb r1, [r0]\n\ + bl _08012F66\n\ + .align 2, 0\n\ +_0801249C: .4byte gBattleMons\n\ +_080124A0: .4byte gActionForBanks\n\ +_080124A4: .4byte gBattleCommunication\n\ +_080124A8:\n\ + ldr r0, _080124C0 @ =gActionForBanks\n\ + ldrb r1, [r0]\n\ + ldr r0, _080124C4 @ =gBattleBufferB\n\ + ldrb r2, [r0, 0x1]\n\ + ldrb r0, [r0, 0x2]\n\ + lsls r0, 8\n\ + orrs r2, r0\n\ + movs r0, 0\n\ + bl Emitcmd18\n\ + bl _08012E32\n\ + .align 2, 0\n\ +_080124C0: .4byte gActionForBanks\n\ +_080124C4: .4byte gBattleBufferB\n\ +_080124C8:\n\ + ldr r4, _08012520 @ =gBattleExecBuffer\n\ + ldr r1, _08012524 @ =gBitTable\n\ + ldr r3, _08012528 @ =gActiveBank\n\ + ldrb r5, [r3]\n\ + lsls r0, r5, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r0, r2, 4\n\ + movs r1, 0xF0\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + orrs r0, r2\n\ + lsls r1, r2, 8\n\ + orrs r0, r1\n\ + lsls r2, 12\n\ + orrs r0, r2\n\ + ldr r1, [r4]\n\ + ands r1, r0\n\ + mov r8, r3\n\ + cmp r1, 0\n\ + beq _080124F6\n\ + bl _08012F66\n\ +_080124F6:\n\ + ldr r2, _0801252C @ =gActionForBanks\n\ + adds r2, r5, r2\n\ + ldr r1, _08012530 @ =gBattleBufferB\n\ + lsls r0, r5, 9\n\ + adds r1, 0x1\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r2]\n\ + ldrb r0, [r3]\n\ + lsls r0, 9\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xC\n\ + bls _08012514\n\ + b _08012968\n\ +_08012514:\n\ + lsls r0, 2\n\ + ldr r1, _08012534 @ =_08012538\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08012520: .4byte gBattleExecBuffer\n\ +_08012524: .4byte gBitTable\n\ +_08012528: .4byte gActiveBank\n\ +_0801252C: .4byte gActionForBanks\n\ +_08012530: .4byte gBattleBufferB\n\ +_08012534: .4byte _08012538\n\ + .align 2, 0\n\ +_08012538:\n\ + .4byte _0801256C\n\ + .4byte _080126B4\n\ + .4byte _080126E0\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _080128B0\n\ + .4byte _08012908\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _08012968\n\ + .4byte _0801292C\n\ +_0801256C:\n\ + bl AreAllMovesUnusable\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080125D0\n\ + ldr r0, _080125B4 @ =gBattleCommunication\n\ + ldr r2, _080125B8 @ =gActiveBank\n\ + ldrb r1, [r2]\n\ + adds r1, r0\n\ + movs r4, 0\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r3, _080125BC @ =gSharedMem\n\ + ldrb r0, [r2]\n\ + ldr r1, _080125C0 @ =0x00016060\n\ + adds r0, r1\n\ + adds r0, r3\n\ + strb r4, [r0]\n\ + ldrb r0, [r2]\n\ + ldr r4, _080125C4 @ =0x00016094\n\ + adds r0, r4\n\ + adds r0, r3\n\ + movs r1, 0x3\n\ + strb r1, [r0]\n\ + ldrb r1, [r2]\n\ + ldr r0, _080125C8 @ =0x00016010\n\ + adds r2, r1, r0\n\ + adds r2, r3\n\ + ldr r0, _080125CC @ =gBattleBufferB\n\ + lsls r1, 9\n\ + adds r0, 0x3\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + strb r0, [r2]\n\ + bl _08012F90\n\ + .align 2, 0\n\ +_080125B4: .4byte gBattleCommunication\n\ +_080125B8: .4byte gActiveBank\n\ +_080125BC: .4byte gSharedMem\n\ +_080125C0: .4byte 0x00016060\n\ +_080125C4: .4byte 0x00016094\n\ +_080125C8: .4byte 0x00016010\n\ +_080125CC: .4byte gBattleBufferB\n\ +_080125D0:\n\ + ldr r1, _080125FC @ =gDisableStructs\n\ + ldr r5, _08012600 @ =gActiveBank\n\ + ldrb r4, [r5]\n\ + lsls r0, r4, 3\n\ + subs r0, r4\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrh r2, [r0, 0x6]\n\ + cmp r2, 0\n\ + beq _0801260C\n\ + ldr r1, _08012604 @ =gChosenMovesByBanks\n\ + lsls r0, r4, 1\n\ + adds r0, r1\n\ + strh r2, [r0]\n\ + ldr r1, _08012608 @ =gBattleCommunication\n\ + ldrb r0, [r5]\n\ + adds r0, r1\n\ + movs r1, 0x3\n\ + strb r1, [r0]\n\ + bl _08012F90\n\ + .align 2, 0\n\ +_080125FC: .4byte gDisableStructs\n\ +_08012600: .4byte gActiveBank\n\ +_08012604: .4byte gChosenMovesByBanks\n\ +_08012608: .4byte gBattleCommunication\n\ +_0801260C:\n\ + add r2, sp, 0x4\n\ + ldr r3, _080126AC @ =gBattleMons\n\ + movs r1, 0x58\n\ + adds r0, r4, 0\n\ + muls r0, r1\n\ + adds r0, r3\n\ + ldrh r0, [r0]\n\ + strh r0, [r2, 0x10]\n\ + ldrb r0, [r5]\n\ + muls r0, r1\n\ + adds r0, r3\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + strb r0, [r2, 0x12]\n\ + ldrb r0, [r5]\n\ + muls r0, r1\n\ + adds r0, r3\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + strb r0, [r2, 0x13]\n\ + movs r4, 0\n\ + mov r1, sp\n\ + adds r1, 0xC\n\ + str r1, [sp, 0x18]\n\ + add r2, sp, 0x10\n\ + mov r10, r2\n\ + mov r8, r3\n\ + adds r7, r5, 0\n\ + movs r6, 0x58\n\ + movs r3, 0xC\n\ + add r3, r8\n\ + mov r9, r3\n\ + add r5, sp, 0x4\n\ +_0801264E:\n\ + lsls r2, r4, 1\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r2, r0\n\ + add r0, r9\n\ + ldrh r0, [r0]\n\ + strh r0, [r5]\n\ + ldr r0, [sp, 0x18]\n\ + adds r3, r0, r4\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r4, r0\n\ + mov r1, r8\n\ + adds r1, 0x24\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r3]\n\ + ldrb r0, [r7]\n\ + adds r1, r0, 0\n\ + muls r1, r6\n\ + adds r2, r1\n\ + add r2, r9\n\ + ldrh r0, [r2]\n\ + add r1, r8\n\ + adds r1, 0x3B\n\ + ldrb r1, [r1]\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + bl CalculatePPWithBonus\n\ + mov r2, r10\n\ + adds r1, r2, r4\n\ + strb r0, [r1]\n\ + adds r5, 0x2\n\ + adds r4, 0x1\n\ + cmp r4, 0x3\n\ + ble _0801264E\n\ + ldr r0, _080126B0 @ =gBattleTypeFlags\n\ + ldrb r0, [r0]\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + movs r0, 0\n\ + movs r2, 0\n\ + add r3, sp, 0x4\n\ + bl Emitcmd20\n\ + b _0801289E\n\ + .align 2, 0\n\ +_080126AC: .4byte gBattleMons\n\ +_080126B0: .4byte gBattleTypeFlags\n\ +_080126B4:\n\ + ldr r0, _080126D0 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _080126D4 @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080126C2\n\ + b _08012908\n\ +_080126C2:\n\ + ldr r1, _080126D8 @ =gUnknown_02024C1C\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r1, _080126DC @ =BattleScript_ActionSelectionItemsCantBeUsed\n\ + b _080129CC\n\ + .align 2, 0\n\ +_080126D0: .4byte gBattleTypeFlags\n\ +_080126D4: .4byte 0x00000902\n\ +_080126D8: .4byte gUnknown_02024C1C\n\ +_080126DC: .4byte BattleScript_ActionSelectionItemsCantBeUsed\n\ +_080126E0:\n\ + ldr r3, _08012738 @ =gSharedMem\n\ + ldr r5, _0801273C @ =gActiveBank\n\ + ldrb r0, [r5]\n\ + ldr r4, _08012740 @ =0x00016064\n\ + adds r1, r0, r4\n\ + adds r1, r3\n\ + ldr r2, _08012744 @ =gBattlePartyID\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r7, _08012748 @ =gBattleMons\n\ + ldrb r2, [r5]\n\ + movs r6, 0x58\n\ + adds r0, r2, 0\n\ + muls r0, r6\n\ + adds r1, r7, 0\n\ + adds r1, 0x50\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ldr r1, _0801274C @ =0x0400e000\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012722\n\ + ldr r0, _08012750 @ =gStatuses3\n\ + lsls r1, r2, 2\n\ + adds r1, r0\n\ + ldr r1, [r1]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _08012758\n\ +_08012722:\n\ + lsls r0, r2, 1\n\ + adds r0, r2\n\ + ldr r2, _08012754 @ =0x0001606c\n\ + adds r1, r3, r2\n\ + adds r0, r1\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + movs r2, 0x6\n\ + b _0801286C\n\ + .align 2, 0\n\ +_08012738: .4byte gSharedMem\n\ +_0801273C: .4byte gActiveBank\n\ +_08012740: .4byte 0x00016064\n\ +_08012744: .4byte gBattlePartyID\n\ +_08012748: .4byte gBattleMons\n\ +_0801274C: .4byte 0x0400e000\n\ +_08012750: .4byte gStatuses3\n\ +_08012754: .4byte 0x0001606c\n\ +_08012758:\n\ + str r1, [sp]\n\ + movs r0, 0xC\n\ + adds r1, r2, 0\n\ + movs r2, 0x17\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + bne _080127E0\n\ + ldrb r1, [r5]\n\ + str r4, [sp]\n\ + movs r0, 0xC\n\ + movs r2, 0x47\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + beq _080127A8\n\ + ldrb r0, [r5]\n\ + muls r0, r6\n\ + adds r1, r0, r7\n\ + adds r0, r1, 0\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x2\n\ + beq _080127A8\n\ + adds r0, r1, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x2\n\ + beq _080127A8\n\ + adds r0, r1, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1A\n\ + bne _080127E0\n\ +_080127A8:\n\ + ldr r5, _08012808 @ =gActiveBank\n\ + ldrb r1, [r5]\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0xF\n\ + movs r2, 0x2A\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0\n\ + beq _08012818\n\ + ldr r2, _0801280C @ =gBattleMons\n\ + ldrb r1, [r5]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r1, r0, r2\n\ + adds r0, r1, 0\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x8\n\ + beq _080127E0\n\ + adds r0, r1, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x8\n\ + bne _08012818\n\ +_080127E0:\n\ + subs r1, r4, 0x1\n\ + lsls r1, 4\n\ + movs r0, 0x4\n\ + orrs r1, r0\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + ldr r0, _08012810 @ =gLastUsedAbility\n\ + ldrb r3, [r0]\n\ + ldr r0, _08012808 @ =gActiveBank\n\ + ldrb r2, [r0]\n\ + lsls r0, r2, 1\n\ + adds r0, r2\n\ + ldr r2, _08012814 @ =gSharedMem + 0x1606C\n\ + adds r0, r2\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r2, 0x6\n\ + bl EmitChoosePokemon\n\ + b _0801289E\n\ + .align 2, 0\n\ +_08012808: .4byte gActiveBank\n\ +_0801280C: .4byte gBattleMons\n\ +_08012810: .4byte gLastUsedAbility\n\ +_08012814: .4byte gSharedMem + 0x1606C\n\ +_08012818:\n\ + ldr r0, _08012830 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + mov r8, r0\n\ + cmp r1, 0x2\n\ + bne _08012840\n\ + ldr r0, _08012834 @ =gActionForBanks\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x2\n\ + bne _08012840\n\ + ldr r3, _08012838 @ =gSharedMem\n\ + ldr r4, _0801283C @ =0x00016068\n\ + b _08012854\n\ + .align 2, 0\n\ +_08012830: .4byte gActiveBank\n\ +_08012834: .4byte gActionForBanks\n\ +_08012838: .4byte gSharedMem\n\ +_0801283C: .4byte 0x00016068\n\ +_08012840:\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + cmp r0, 0x3\n\ + bne _08012884\n\ + ldr r0, _08012874 @ =gActionForBanks\n\ + ldrb r0, [r0, 0x1]\n\ + cmp r0, 0x2\n\ + bne _08012884\n\ + ldr r3, _08012878 @ =gSharedMem\n\ + ldr r4, _0801287C @ =0x00016069\n\ +_08012854:\n\ + adds r0, r3, r4\n\ + ldrb r2, [r0]\n\ + mov r0, r8\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + ldr r1, _08012880 @ =0x0001606c\n\ + adds r3, r1\n\ + adds r0, r3\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0\n\ +_0801286C:\n\ + movs r3, 0\n\ + bl EmitChoosePokemon\n\ + b _0801289E\n\ + .align 2, 0\n\ +_08012874: .4byte gActionForBanks\n\ +_08012878: .4byte gSharedMem\n\ +_0801287C: .4byte 0x00016069\n\ +_08012880: .4byte 0x0001606c\n\ +_08012884:\n\ + ldr r0, _080128A8 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + ldr r1, _080128AC @ =gSharedMem + 0x1606C\n\ + adds r0, r1\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r2, 0x6\n\ + movs r3, 0\n\ + bl EmitChoosePokemon\n\ +_0801289E:\n\ + ldr r0, _080128A8 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + bl MarkBufferBankForExecution\n\ + b _08012968\n\ + .align 2, 0\n\ +_080128A8: .4byte gActiveBank\n\ +_080128AC: .4byte gSharedMem + 0x1606C\n\ +_080128B0:\n\ + bl PlayerPartyAndPokemonStorageFull\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08012968\n\ + ldr r1, _080128EC @ =gUnknown_02024C1C\n\ + ldr r2, _080128F0 @ =gActiveBank\n\ + ldrb r0, [r2]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r1, _080128F4 @ =BattleScript_PrintFullBox\n\ + str r1, [r0]\n\ + ldr r0, _080128F8 @ =gBattleCommunication\n\ + ldrb r1, [r2]\n\ + adds r1, r0\n\ + movs r3, 0\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r1, _080128FC @ =gSharedMem\n\ + ldrb r0, [r2]\n\ + ldr r4, _08012900 @ =0x00016060\n\ + adds r0, r4\n\ + adds r0, r1\n\ + strb r3, [r0]\n\ + ldrb r0, [r2]\n\ + ldr r2, _08012904 @ =0x00016094\n\ + adds r0, r2\n\ + adds r0, r1\n\ + strb r3, [r0]\n\ + b _08012F90\n\ + .align 2, 0\n\ +_080128EC: .4byte gUnknown_02024C1C\n\ +_080128F0: .4byte gActiveBank\n\ +_080128F4: .4byte BattleScript_PrintFullBox\n\ +_080128F8: .4byte gBattleCommunication\n\ +_080128FC: .4byte gSharedMem\n\ +_08012900: .4byte 0x00016060\n\ +_08012904: .4byte 0x00016094\n\ +_08012908:\n\ + ldr r4, _08012924 @ =gActiveBank\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + ldr r0, _08012928 @ =gSharedMem + 0x1606C\n\ + adds r1, r0\n\ + movs r0, 0\n\ + bl EmitOpenBag\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08012968\n\ + .align 2, 0\n\ +_08012924: .4byte gActiveBank\n\ +_08012928: .4byte gSharedMem + 0x1606C\n\ +_0801292C:\n\ + ldr r4, _08012964 @ =gBattleCommunication\n\ + mov r3, r8\n\ + ldrb r1, [r3]\n\ + adds r1, r4\n\ + movs r5, 0\n\ + movs r0, 0x6\n\ + strb r0, [r1]\n\ + ldrb r0, [r3]\n\ + bl GetBankIdentity\n\ + movs r1, 0x2\n\ + eors r0, r1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetBankByPlayerAI\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r0, r4\n\ + strb r5, [r0]\n\ + movs r0, 0\n\ + bl Emitcmd50\n\ + mov r4, r8\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08012F90\n\ + .align 2, 0\n\ +_08012964: .4byte gBattleCommunication\n\ +_08012968:\n\ + ldr r0, _08012994 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0xA\n\ + ands r0, r1\n\ + cmp r0, 0x8\n\ + bne _080129A8\n\ + ldr r0, _08012998 @ =gBattleBufferB\n\ + ldr r4, _0801299C @ =gActiveBank\n\ + ldrb r1, [r4]\n\ + lsls r1, 9\n\ + adds r0, 0x1\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x3\n\ + bne _080129A8\n\ + ldr r0, _080129A0 @ =BattleScript_PrintCantRunFromTrainer\n\ + bl b_call_bc_move_exec\n\ + ldr r1, _080129A4 @ =gBattleCommunication\n\ + ldrb r0, [r4]\n\ + adds r0, r1\n\ + b _08012BFE\n\ + .align 2, 0\n\ +_08012994: .4byte gBattleTypeFlags\n\ +_08012998: .4byte gBattleBufferB\n\ +_0801299C: .4byte gActiveBank\n\ +_080129A0: .4byte BattleScript_PrintCantRunFromTrainer\n\ +_080129A4: .4byte gBattleCommunication\n\ +_080129A8:\n\ + bl CanRunFromBattle\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08012A14\n\ + ldr r0, _080129F4 @ =gBattleBufferB\n\ + ldr r3, _080129F8 @ =gActiveBank\n\ + ldrb r2, [r3]\n\ + lsls r1, r2, 9\n\ + adds r0, 0x1\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x3\n\ + bne _08012A14\n\ + ldr r1, _080129FC @ =gUnknown_02024C1C\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r1, _08012A00 @ =BattleScript_PrintCantEscapeFromBattle\n\ +_080129CC:\n\ + str r1, [r0]\n\ + ldr r0, _08012A04 @ =gBattleCommunication\n\ + ldrb r1, [r3]\n\ + adds r1, r0\n\ + movs r2, 0\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r1, _08012A08 @ =gSharedMem\n\ + ldrb r0, [r3]\n\ + ldr r4, _08012A0C @ =0x00016060\n\ + adds r0, r4\n\ + adds r0, r1\n\ + strb r2, [r0]\n\ + ldrb r0, [r3]\n\ + ldr r3, _08012A10 @ =0x00016094\n\ + adds r0, r3\n\ + adds r0, r1\n\ + strb r2, [r0]\n\ + b _08012F90\n\ + .align 2, 0\n\ +_080129F4: .4byte gBattleBufferB\n\ +_080129F8: .4byte gActiveBank\n\ +_080129FC: .4byte gUnknown_02024C1C\n\ +_08012A00: .4byte BattleScript_PrintCantEscapeFromBattle\n\ +_08012A04: .4byte gBattleCommunication\n\ +_08012A08: .4byte gSharedMem\n\ +_08012A0C: .4byte 0x00016060\n\ +_08012A10: .4byte 0x00016094\n\ +_08012A14:\n\ + ldr r2, _08012A20 @ =gBattleCommunication\n\ + ldr r0, _08012A24 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012A20: .4byte gBattleCommunication\n\ +_08012A24: .4byte gActiveBank\n\ +_08012A28:\n\ + ldr r4, _08012A6C @ =gBattleExecBuffer\n\ + ldr r1, _08012A70 @ =gBitTable\n\ + ldr r3, _08012A74 @ =gActiveBank\n\ + ldrb r5, [r3]\n\ + lsls r0, r5, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r0, r2, 4\n\ + movs r1, 0xF0\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + orrs r0, r2\n\ + lsls r1, r2, 8\n\ + orrs r0, r1\n\ + lsls r2, 12\n\ + orrs r0, r2\n\ + ldr r1, [r4]\n\ + ands r1, r0\n\ + mov r8, r3\n\ + cmp r1, 0\n\ + beq _08012A54\n\ + b _08012F66\n\ +_08012A54:\n\ + ldr r1, _08012A78 @ =gActionForBanks\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + adds r3, r1, 0\n\ + cmp r0, 0x9\n\ + bls _08012A62\n\ + b _08012F66\n\ +_08012A62:\n\ + lsls r0, 2\n\ + ldr r1, _08012A7C @ =_08012A80\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08012A6C: .4byte gBattleExecBuffer\n\ +_08012A70: .4byte gBitTable\n\ +_08012A74: .4byte gActiveBank\n\ +_08012A78: .4byte gActionForBanks\n\ +_08012A7C: .4byte _08012A80\n\ + .align 2, 0\n\ +_08012A80:\n\ + .4byte _08012AA8\n\ + .4byte _08012BB0\n\ + .4byte _08012BE8\n\ + .4byte _08012CE0\n\ + .4byte _08012D04\n\ + .4byte _08012D18\n\ + .4byte _08012D2C\n\ + .4byte _08012D5C\n\ + .4byte _08012D70\n\ + .4byte _08012D94\n\ +_08012AA8:\n\ + ldr r0, _08012AC8 @ =gBattleBufferB\n\ + mov r1, r8\n\ + ldrb r4, [r1]\n\ + lsls r1, r4, 9\n\ + adds r2, r0, 0x1\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + adds r6, r0, 0\n\ + cmp r1, 0x9\n\ + bgt _08012ACC\n\ + cmp r1, 0x3\n\ + blt _08012ACC\n\ + adds r0, r4, r3\n\ + strb r1, [r0]\n\ + b _08012F90\n\ + .align 2, 0\n\ +_08012AC8: .4byte gBattleBufferB\n\ +_08012ACC:\n\ + adds r3, r6, 0\n\ + mov r5, r8\n\ + ldrb r4, [r5]\n\ + lsls r1, r4, 9\n\ + adds r7, r3, 0x2\n\ + adds r0, r1, r7\n\ + ldrb r2, [r0]\n\ + adds r3, 0x3\n\ + mov r9, r3\n\ + add r1, r9\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r2, r0\n\ + ldr r0, _08012AF4 @ =0x0000ffff\n\ + cmp r2, r0\n\ + bne _08012AFC\n\ + ldr r0, _08012AF8 @ =gBattleCommunication\n\ + adds r0, r4, r0\n\ + b _08012BFE\n\ + .align 2, 0\n\ +_08012AF4: .4byte 0x0000ffff\n\ +_08012AF8: .4byte gBattleCommunication\n\ +_08012AFC:\n\ + bl sub_8015894\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08012B48\n\ + ldr r0, _08012B38 @ =gBattleCommunication\n\ + ldrb r1, [r5]\n\ + adds r1, r0\n\ + movs r2, 0\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r3, _08012B3C @ =gSharedMem\n\ + ldrb r0, [r5]\n\ + ldr r4, _08012B40 @ =0x00016060\n\ + adds r0, r4\n\ + adds r0, r3\n\ + strb r2, [r0]\n\ + ldrb r0, [r5]\n\ + lsls r0, 9\n\ + adds r1, r6, 0x1\n\ + adds r0, r1\n\ + strb r2, [r0]\n\ + ldrb r0, [r5]\n\ + ldr r1, _08012B44 @ =0x00016094\n\ + adds r0, r1\n\ + adds r0, r3\n\ + movs r1, 0x1\n\ + strb r1, [r0]\n\ + b _08012F90\n\ + .align 2, 0\n\ +_08012B38: .4byte gBattleCommunication\n\ +_08012B3C: .4byte gSharedMem\n\ +_08012B40: .4byte 0x00016060\n\ +_08012B44: .4byte 0x00016094\n\ +_08012B48:\n\ + ldr r6, _08012B98 @ =gSharedMem\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + ldr r2, _08012B9C @ =0x0001608c\n\ + adds r1, r0, r2\n\ + adds r1, r6\n\ + lsls r0, 9\n\ + adds r0, r7\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r0, _08012BA0 @ =gChosenMovesByBanks\n\ + mov r4, r8\n\ + ldrb r3, [r4]\n\ + lsls r5, r3, 1\n\ + adds r5, r0\n\ + ldr r4, _08012BA4 @ =gBattleMons\n\ + adds r2, r3, r2\n\ + adds r2, r6\n\ + ldrb r0, [r2]\n\ + lsls r0, 1\n\ + movs r1, 0x58\n\ + muls r1, r3\n\ + adds r0, r1\n\ + adds r4, 0xC\n\ + adds r0, r4\n\ + ldrh r0, [r0]\n\ + strh r0, [r5]\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + ldr r2, _08012BA8 @ =0x00016010\n\ + adds r1, r0, r2\n\ + adds r1, r6\n\ + lsls r0, 9\n\ + add r0, r9\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r0, _08012BAC @ =gBattleCommunication\n\ + mov r3, r8\n\ + ldrb r1, [r3]\n\ + b _08012E3C\n\ + .align 2, 0\n\ +_08012B98: .4byte gSharedMem\n\ +_08012B9C: .4byte 0x0001608c\n\ +_08012BA0: .4byte gChosenMovesByBanks\n\ +_08012BA4: .4byte gBattleMons\n\ +_08012BA8: .4byte 0x00016010\n\ +_08012BAC: .4byte gBattleCommunication\n\ +_08012BB0:\n\ + ldr r2, _08012BD8 @ =gBattleBufferB\n\ + ldr r5, _08012BDC @ =gActiveBank\n\ + ldrb r4, [r5]\n\ + lsls r1, r4, 9\n\ + adds r0, r2, 0x1\n\ + adds r0, r1, r0\n\ + ldrb r3, [r0]\n\ + adds r2, 0x2\n\ + adds r1, r2\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r3, r0\n\ + cmp r3, 0\n\ + bne _08012BCE\n\ + b _08012F60\n\ +_08012BCE:\n\ + ldr r0, _08012BE0 @ =gLastUsedItem\n\ + strh r3, [r0]\n\ + ldr r0, _08012BE4 @ =gBattleCommunication\n\ + ldrb r1, [r5]\n\ + b _08012E3C\n\ + .align 2, 0\n\ +_08012BD8: .4byte gBattleBufferB\n\ +_08012BDC: .4byte gActiveBank\n\ +_08012BE0: .4byte gLastUsedItem\n\ +_08012BE4: .4byte gBattleCommunication\n\ +_08012BE8:\n\ + ldr r4, _08012C04 @ =gBattleBufferB\n\ + ldr r7, _08012C08 @ =gActiveBank\n\ + ldrb r2, [r7]\n\ + lsls r0, r2, 9\n\ + adds r1, r4, 0x1\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + cmp r1, 0x6\n\ + bne _08012C10\n\ + ldr r0, _08012C0C @ =gBattleCommunication\n\ + adds r0, r2, r0\n\ +_08012BFE:\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012C04: .4byte gBattleBufferB\n\ +_08012C08: .4byte gActiveBank\n\ +_08012C0C: .4byte gBattleCommunication\n\ +_08012C10:\n\ + ldr r0, _08012CC4 @ =gSharedMem\n\ + mov r12, r0\n\ + ldr r3, _08012CC8 @ =0x00016068\n\ + adds r0, r2, r3\n\ + add r0, r12\n\ + strb r1, [r0]\n\ + ldr r0, _08012CCC @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08012CBE\n\ + ldrb r0, [r7]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + ldr r5, _08012CD0 @ =0x0001606c\n\ + adds r1, r5\n\ + add r1, r12\n\ + ldrb r2, [r1]\n\ + movs r0, 0xF\n\ + ands r0, r2\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + lsls r2, r0, 1\n\ + adds r2, r0\n\ + adds r2, r5\n\ + add r2, r12\n\ + lsls r0, 9\n\ + adds r6, r4, 0x2\n\ + adds r0, r6\n\ + ldrb r1, [r0]\n\ + movs r3, 0xF0\n\ + adds r0, r3, 0\n\ + ands r0, r1\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldrb r0, [r7]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + ldr r2, _08012CD4 @ =0x0001606d\n\ + adds r1, r2\n\ + add r1, r12\n\ + lsls r0, 9\n\ + adds r4, 0x3\n\ + mov r8, r4\n\ + add r0, r8\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + movs r4, 0x2\n\ + eors r0, r4\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + adds r1, r5\n\ + add r1, r12\n\ + ldrb r2, [r1]\n\ + adds r0, r3, 0\n\ + ands r0, r2\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + eors r0, r4\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + adds r1, r5\n\ + add r1, r12\n\ + ldrb r0, [r7]\n\ + lsls r0, 9\n\ + adds r0, r6\n\ + ldrb r0, [r0]\n\ + ands r3, r0\n\ + lsrs r3, 4\n\ + ldrb r0, [r1]\n\ + orrs r3, r0\n\ + strb r3, [r1]\n\ + ldrb r0, [r7]\n\ + eors r4, r0\n\ + lsls r1, r4, 1\n\ + adds r1, r4\n\ + ldr r3, _08012CD8 @ =0x0001606e\n\ + adds r1, r3\n\ + add r1, r12\n\ + ldrb r0, [r7]\n\ + lsls r0, 9\n\ + add r0, r8\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ +_08012CBE:\n\ + ldr r0, _08012CDC @ =gBattleCommunication\n\ + ldrb r1, [r7]\n\ + b _08012E3C\n\ + .align 2, 0\n\ +_08012CC4: .4byte gSharedMem\n\ +_08012CC8: .4byte 0x00016068\n\ +_08012CCC: .4byte gBattleTypeFlags\n\ +_08012CD0: .4byte 0x0001606c\n\ +_08012CD4: .4byte 0x0001606d\n\ +_08012CD8: .4byte 0x0001606e\n\ +_08012CDC: .4byte gBattleCommunication\n\ +_08012CE0:\n\ + ldr r2, _08012CF8 @ =gHitMarker\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 8\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r2, _08012CFC @ =gBattleCommunication\n\ + ldr r0, _08012D00 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012CF8: .4byte gHitMarker\n\ +_08012CFC: .4byte gBattleCommunication\n\ +_08012D00: .4byte gActiveBank\n\ +_08012D04:\n\ + ldr r2, _08012D10 @ =gBattleCommunication\n\ + ldr r0, _08012D14 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D10: .4byte gBattleCommunication\n\ +_08012D14: .4byte gActiveBank\n\ +_08012D18:\n\ + ldr r2, _08012D24 @ =gBattleCommunication\n\ + ldr r0, _08012D28 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D24: .4byte gBattleCommunication\n\ +_08012D28: .4byte gActiveBank\n\ +_08012D2C:\n\ + ldr r2, _08012D50 @ =gBattleBufferB\n\ + ldr r0, _08012D54 @ =gActiveBank\n\ + ldrb r4, [r0]\n\ + lsls r1, r4, 9\n\ + adds r0, r2, 0x1\n\ + adds r0, r1, r0\n\ + ldrb r3, [r0]\n\ + adds r2, 0x2\n\ + adds r1, r2\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r3, r0\n\ + cmp r3, 0\n\ + bne _08012D4A\n\ + b _08012F60\n\ +_08012D4A:\n\ + ldr r1, _08012D58 @ =gBattleCommunication\n\ + adds r1, r4, r1\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D50: .4byte gBattleBufferB\n\ +_08012D54: .4byte gActiveBank\n\ +_08012D58: .4byte gBattleCommunication\n\ +_08012D5C:\n\ + ldr r2, _08012D68 @ =gBattleCommunication\n\ + ldr r0, _08012D6C @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D68: .4byte gBattleCommunication\n\ +_08012D6C: .4byte gActiveBank\n\ +_08012D70:\n\ + ldr r2, _08012D88 @ =gHitMarker\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 8\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r2, _08012D8C @ =gBattleCommunication\n\ + ldr r0, _08012D90 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012D88: .4byte gHitMarker\n\ +_08012D8C: .4byte gBattleCommunication\n\ +_08012D90: .4byte gActiveBank\n\ +_08012D94:\n\ + ldr r2, _08012DA0 @ =gBattleCommunication\n\ + ldr r0, _08012DA4 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, r2\n\ + b _08012E3E\n\ + .align 2, 0\n\ +_08012DA0: .4byte gBattleCommunication\n\ +_08012DA4: .4byte gActiveBank\n\ +_08012DA8:\n\ + ldr r3, _08012E10 @ =gBattleExecBuffer\n\ + ldr r4, _08012E14 @ =gBitTable\n\ + ldr r0, _08012E18 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldr r2, [r0]\n\ + lsls r1, r2, 4\n\ + movs r0, 0xF0\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + orrs r1, r2\n\ + lsls r0, r2, 8\n\ + orrs r1, r0\n\ + lsls r2, 12\n\ + orrs r1, r2\n\ + ldr r0, [r3]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08012DD2\n\ + b _08012F66\n\ +_08012DD2:\n\ + ldr r0, _08012E1C @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x41\n\ + ands r0, r1\n\ + cmp r0, 0x1\n\ + bne _08012E06\n\ + movs r1, 0x2\n\ + movs r0, 0x2\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + bne _08012E06\n\ + adds r0, r5, 0\n\ + eors r0, r1\n\ + bl GetBankByPlayerAI\n\ + ldr r1, _08012E20 @ =gSharedMem\n\ + ldr r2, _08012E24 @ =0x000160a6\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + lsls r0, 24\n\ + lsrs r0, 22\n\ + adds r0, r4\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _08012E28\n\ +_08012E06:\n\ + movs r0, 0\n\ + movs r1, 0\n\ + bl EmitLinkStandbyMsg\n\ + b _08012E30\n\ + .align 2, 0\n\ +_08012E10: .4byte gBattleExecBuffer\n\ +_08012E14: .4byte gBitTable\n\ +_08012E18: .4byte gActiveBank\n\ +_08012E1C: .4byte gBattleTypeFlags\n\ +_08012E20: .4byte gSharedMem\n\ +_08012E24: .4byte 0x000160a6\n\ +_08012E28:\n\ + movs r0, 0\n\ + movs r1, 0x1\n\ + bl EmitLinkStandbyMsg\n\ +_08012E30:\n\ + ldr r4, _08012E48 @ =gActiveBank\n\ +_08012E32:\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, _08012E4C @ =gBattleCommunication\n\ + ldrb r1, [r4]\n\ +_08012E3C:\n\ + adds r1, r0\n\ +_08012E3E:\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012E48: .4byte gActiveBank\n\ +_08012E4C: .4byte gBattleCommunication\n\ +_08012E50:\n\ + ldr r3, _08012E84 @ =gBattleExecBuffer\n\ + ldr r1, _08012E88 @ =gBitTable\n\ + ldr r0, _08012E8C @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r1, r2, 4\n\ + movs r0, 0xF0\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + orrs r1, r2\n\ + lsls r0, r2, 8\n\ + orrs r1, r0\n\ + lsls r2, 12\n\ + orrs r1, r2\n\ + ldr r0, [r3]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012F66\n\ + ldr r1, _08012E90 @ =gBattleCommunication\n\ + ldrb r0, [r1, 0x4]\n\ + adds r0, 0x1\n\ + strb r0, [r1, 0x4]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012E84: .4byte gBattleExecBuffer\n\ +_08012E88: .4byte gBitTable\n\ +_08012E8C: .4byte gActiveBank\n\ +_08012E90: .4byte gBattleCommunication\n\ +_08012E94:\n\ + ldr r2, _08012EB8 @ =gSharedMem\n\ + ldr r5, _08012EBC @ =gActiveBank\n\ + ldrb r1, [r5]\n\ + ldr r3, _08012EC0 @ =0x00016060\n\ + adds r0, r1, r3\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _08012ECC\n\ + ldr r0, _08012EC4 @ =gBattleCommunication\n\ + adds r0, r1, r0\n\ + ldr r4, _08012EC8 @ =0x00016094\n\ + adds r1, r4\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + strb r1, [r0]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012EB8: .4byte gSharedMem\n\ +_08012EBC: .4byte gActiveBank\n\ +_08012EC0: .4byte 0x00016060\n\ +_08012EC4: .4byte gBattleCommunication\n\ +_08012EC8: .4byte 0x00016094\n\ +_08012ECC:\n\ + ldr r0, _08012F20 @ =gBankAttacker\n\ + strb r1, [r0]\n\ + ldr r7, _08012F24 @ =gBattlescriptCurrInstr\n\ + ldr r6, _08012F28 @ =gUnknown_02024C1C\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r4, [r0]\n\ + str r4, [r7]\n\ + ldr r3, _08012F2C @ =gBattleExecBuffer\n\ + ldr r1, _08012F30 @ =gBitTable\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r1, r2, 4\n\ + movs r0, 0xF0\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + orrs r1, r2\n\ + lsls r0, r2, 8\n\ + orrs r1, r0\n\ + lsls r2, 12\n\ + orrs r1, r2\n\ + ldr r0, [r3]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08012F12\n\ + ldr r0, _08012F34 @ =gBattleScriptingCommandsTable\n\ + ldrb r1, [r4]\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldr r0, [r1]\n\ + bl _call_via_r0\n\ +_08012F12:\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r1, [r7]\n\ + str r1, [r0]\n\ + b _08012F66\n\ + .align 2, 0\n\ +_08012F20: .4byte gBankAttacker\n\ +_08012F24: .4byte gBattlescriptCurrInstr\n\ +_08012F28: .4byte gUnknown_02024C1C\n\ +_08012F2C: .4byte gBattleExecBuffer\n\ +_08012F30: .4byte gBitTable\n\ +_08012F34: .4byte gBattleScriptingCommandsTable\n\ +_08012F38:\n\ + ldr r3, _08012FA0 @ =gBattleExecBuffer\n\ + ldr r1, _08012FA4 @ =gBitTable\n\ + ldr r0, _08012FA8 @ =gActiveBank\n\ + ldrb r4, [r0]\n\ + lsls r0, r4, 2\n\ + adds r0, r1\n\ + ldr r2, [r0]\n\ + lsls r0, r2, 4\n\ + movs r1, 0xF0\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + orrs r0, r2\n\ + lsls r1, r2, 8\n\ + orrs r0, r1\n\ + lsls r2, 12\n\ + orrs r0, r2\n\ + ldr r3, [r3]\n\ + ands r3, r0\n\ + cmp r3, 0\n\ + bne _08012F66\n\ +_08012F60:\n\ + ldr r0, _08012FAC @ =gBattleCommunication\n\ + adds r0, r4, r0\n\ + strb r3, [r0]\n\ +_08012F66:\n\ + ldr r0, _08012FA8 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + adds r1, 0x1\n\ + strb r1, [r0]\n\ + ldr r0, _08012FB0 @ =gNoOfAllBanks\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ +_08012F74:\n\ + adds r2, r0, 0\n\ + ldrb r0, [r2]\n\ + cmp r1, r0\n\ + bcs _08012F80\n\ + bl _0801234C\n\ +_08012F80:\n\ + ldr r0, _08012FAC @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x4]\n\ + ldrb r2, [r2]\n\ + cmp r0, r2\n\ + bne _08012F90\n\ + ldr r1, _08012FB4 @ =gBattleMainFunc\n\ + ldr r0, _08012FB8 @ =sub_80133C8\n\ + str r0, [r1]\n\ +_08012F90:\n\ + add sp, 0x1C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08012FA0: .4byte gBattleExecBuffer\n\ +_08012FA4: .4byte gBitTable\n\ +_08012FA8: .4byte gActiveBank\n\ +_08012FAC: .4byte gBattleCommunication\n\ +_08012FB0: .4byte gNoOfAllBanks\n\ +_08012FB4: .4byte gBattleMainFunc\n\ +_08012FB8: .4byte sub_80133C8\n\ + .syntax divided\n"); +} + +void sub_8012FBC(u8 a, u8 b) +{ + int temp; + + temp = gUnknown_02024A76[a]; + gUnknown_02024A76[a] = gUnknown_02024A76[b]; + gUnknown_02024A76[b] = temp; + + temp = gTurnOrder[a]; + gTurnOrder[a] = gTurnOrder[b]; + gTurnOrder[b] = temp; +} + +// Determines which of the two given mons will strike first in a battle. +// Returns: +// 0 = first mon moves first +// 1 = second mon moves first +// 2 = second mon moves first because it won a 50/50 roll +u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreMovePriorities) +{ + int bank1SpeedMultiplier, bank2SpeedMultiplier; + u32 bank1AdjustedSpeed, bank2AdjustedSpeed; + u8 heldItemEffect; + u8 heldItemEffectParam; + u16 bank1Move; + u16 bank2Move; + u8 strikesFirst = 0; + + // Check for abilities that boost speed in weather. + if (WEATHER_HAS_EFFECT) + { + if ((gBattleMons[bank1].ability == ABILITY_SWIFT_SWIM && (gBattleWeather & WEATHER_RAIN_ANY)) + || (gBattleMons[bank1].ability == ABILITY_CHLOROPHYLL && (gBattleWeather & WEATHER_SUN_ANY))) + bank1SpeedMultiplier = 2; + else + bank1SpeedMultiplier = 1; + + if ((gBattleMons[bank2].ability == ABILITY_SWIFT_SWIM && (gBattleWeather & WEATHER_RAIN_ANY)) + || (gBattleMons[bank2].ability == ABILITY_CHLOROPHYLL && (gBattleWeather & WEATHER_SUN_ANY))) + bank2SpeedMultiplier = 2; + else + bank2SpeedMultiplier = 1; + } + else + { + bank1SpeedMultiplier = 1; + bank2SpeedMultiplier = 1; + } + + // Calculate adjusted speed for first mon. + bank1AdjustedSpeed = (gBattleMons[bank1].speed * bank1SpeedMultiplier) + * gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][0] / gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][1]; + + if (gBattleMons[bank1].item == ITEM_ENIGMA_BERRY) + { + heldItemEffect = gEnigmaBerries[bank1].holdEffect; + heldItemEffectParam = gEnigmaBerries[bank1].holdEffectParam; + } + else + { + heldItemEffect = ItemId_GetHoldEffect(gBattleMons[bank1].item); + heldItemEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank1].item); + } + + // Only give badge speed boost to the player's mon. + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBankSide(bank1) == 0) + bank1AdjustedSpeed = (bank1AdjustedSpeed * 110) / 100; + + if (heldItemEffect == HOLD_EFFECT_MACHO_BRACE) + bank1AdjustedSpeed /= 2; + + if (gBattleMons[bank1].status1 & STATUS_PARALYSIS) + bank1AdjustedSpeed /= 4; + + if (heldItemEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (heldItemEffectParam * 0xFFFF) / 100) + bank1AdjustedSpeed = UINT_MAX; + + // Calculate adjusted speed for second mon. + bank2AdjustedSpeed = gBattleMons[bank2].speed * bank2SpeedMultiplier + * gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][0] / gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][1]; + + if (gBattleMons[bank2].item == ITEM_ENIGMA_BERRY) + { + heldItemEffect = gEnigmaBerries[bank2].holdEffect; + heldItemEffectParam = gEnigmaBerries[bank2].holdEffectParam; + } + else + { + heldItemEffect = ItemId_GetHoldEffect(gBattleMons[bank2].item); + heldItemEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank2].item); + } + + // Only give badge speed boost to the player's mon. + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBankSide(bank2) == 0) + { + bank2AdjustedSpeed = (bank2AdjustedSpeed * 110) / 100; + } + + if (heldItemEffect == HOLD_EFFECT_MACHO_BRACE) + bank2AdjustedSpeed /= 2; + + if (gBattleMons[bank2].status1 & STATUS_PARALYSIS) + bank2AdjustedSpeed /= 4; + + if (heldItemEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (heldItemEffectParam * 0xFFFF) / 100) + bank2AdjustedSpeed = UINT_MAX; + + if (ignoreMovePriorities) + { + bank1Move = MOVE_NONE; + bank2Move = MOVE_NONE; + } + else + { + if (gActionForBanks[bank1] == 0) + { + if (gProtectStructs[bank1].onlyStruggle) + bank1Move = MOVE_STRUGGLE; + else + bank1Move = gBattleMons[bank1].moves[ewram1608Carr(bank1)]; + } + else + bank1Move = MOVE_NONE; + + if (gActionForBanks[bank2] == 0) + { + if (gProtectStructs[bank2].onlyStruggle) + bank2Move = MOVE_STRUGGLE; + else + bank2Move = gBattleMons[bank2].moves[ewram1608Carr(bank2)]; + } + else + bank2Move = MOVE_NONE; + } + + if (gBattleMoves[bank1Move].priority != 0 || gBattleMoves[bank2Move].priority != 0) + { + if (gBattleMoves[bank1Move].priority == gBattleMoves[bank2Move].priority) + { + if (bank1AdjustedSpeed == bank2AdjustedSpeed && (Random() & 1)) + strikesFirst = 2; + else if (bank1AdjustedSpeed < bank2AdjustedSpeed) + strikesFirst = 1; + } + else if (gBattleMoves[bank1Move].priority < gBattleMoves[bank2Move].priority) + strikesFirst = 1; + } + else + { + if (bank1AdjustedSpeed == bank2AdjustedSpeed && (Random() & 1)) + strikesFirst = 2; + else if (bank1AdjustedSpeed < bank2AdjustedSpeed) + strikesFirst = 1; + } + + return strikesFirst; +} diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c index 1fa7a2ed2..6b892ea7a 100644 --- a/src/battle/battle_ai.c +++ b/src/battle/battle_ai.c @@ -1275,7 +1275,7 @@ static void BattleAICmd_if_arg_not_equal(void) static void BattleAICmd_if_would_go_first(void) { - if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, 1) == gAIScriptPtr[1]) + if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, TRUE) == gAIScriptPtr[1]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; @@ -1283,7 +1283,7 @@ static void BattleAICmd_if_would_go_first(void) static void BattleAICmd_if_would_not_go_first(void) { - if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, 1) != gAIScriptPtr[1]) + if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, TRUE) != gAIScriptPtr[1]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; -- cgit v1.2.3 From c0e0004ffabfcb9bc9827bdce28e3c18a6e52922 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 7 Jan 2018 10:59:12 -0800 Subject: Decompile through HandleEndTurn_BattleWon, and update trainer class constant names --- src/battle/anim/fire_2.c | 4 +- src/battle/battle_2.c | 313 +++++++++++++++++++++++++++++-- src/battle/battle_3.c | 62 +++--- src/battle/battle_4.c | 124 ++++++------ src/battle/battle_7.c | 10 +- src/battle/battle_ai.c | 2 +- src/battle/battle_anim_80A7E7C.c | 8 +- src/battle/battle_controller_opponent.c | 24 +-- src/battle/battle_controller_player.c | 22 +-- src/battle/battle_controller_safari.c | 6 +- src/battle/battle_controller_wally.c | 6 +- src/battle/battle_message.c | 16 +- src/battle/battle_party_menu.c | 14 +- src/battle/pokeball.c | 10 +- src/battle/reshow_battle_screen.c | 4 +- src/data/battle_tower/trainers.h | 200 ++++++++++---------- src/data/battle_tower/trainers_de.h | 200 ++++++++++---------- src/data/pokemon/trainer_class_lookups.h | 160 ++++++++-------- src/de_rom_8040FE0.c | 22 +-- src/field/battle_tower.c | 100 +++++----- src/pokemon/pokemon_2.c | 8 +- src/pokemon/pokemon_data.c | 4 +- src/rom_8077ABC.c | 40 ++-- 23 files changed, 812 insertions(+), 547 deletions(-) (limited to 'src') diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c index 6dc304232..4d577a765 100644 --- a/src/battle/anim/fire_2.c +++ b/src/battle/anim/fire_2.c @@ -23,8 +23,8 @@ void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3); void sub_80D51A8(struct Sprite *sprite) { if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget) - && (gAnimBankAttacker == GetBankByPlayerAI(2) - || gAnimBankAttacker == GetBankByPlayerAI(3))) + && (gAnimBankAttacker == GetBankByIdentity(2) + || gAnimBankAttacker == GetBankByIdentity(3))) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->callback = sub_8079534; diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 90d0d40e3..92e9e3e1d 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -24,6 +24,7 @@ #include "sprite.h" #include "task.h" #include "text.h" +#include "trainer.h" #include "trig.h" #include "unknown_task.h" #include "util.h" @@ -66,7 +67,7 @@ extern u8 gActiveBank; extern u32 gBattleExecBuffer; extern u8 gNoOfAllBanks; extern u16 gBattlePartyID[]; -extern u8 gFightStateTracker; +extern u8 gCurrentActionFuncId; extern u8 gTurnOrder[]; extern struct UnknownStruct12 gUnknown_02024AD0[]; extern u8 gObjectBankIDs[]; @@ -133,8 +134,26 @@ extern u16 gBattleWeather; extern u32 gBattleMoveDamage; extern struct BattlePokemon gBattleMons[]; extern u8 gBattleMoveFlags; +extern const u8 BattleScript_FocusPunchSetUp[]; +extern u16 gDynamicBasePower; +extern u8 gCurrentTurnActionNumber; +extern void (* const gUnknown_081FA640[])(void); +extern void (* const gUnknown_081FA678[])(void); +extern u8* gBattlescriptCurrInstr; +extern u8 gUnknown_081D8E02[]; +extern u8 BattleScript_PayDayMoneyAndPickUpItems[]; +extern u8 gUnknown_081D8E0D[]; +extern u8 BattleScript_LocalTrainerBattleWon[]; + +void b_call_bc_move_exec(const u8* BS_ptr); static void BattlePrepIntroSlide(void); +void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); +void SetActionsAndBanksTurnOrder(void); +static void TurnValuesCleanUp(u8); +void SpecialStatusesClear(void); +static void RunTurnActionsFunctions(void); +void sub_8013C9C(); void sub_800E7C4(void) { @@ -1538,7 +1557,7 @@ void sub_8010874(void) for (i = 0; i < 2; i++) { gSideAffecting[i] = 0; - MEMSET_ALT(&gSideTimer[i], 0, 12, j, r4); + MEMSET_ALT(&gSideTimers[i], 0, 12, j, r4); } gBankAttacker = 0; @@ -1791,7 +1810,7 @@ static void BattlePrepIntroSlide(void) { if (gBattleExecBuffer == 0) { - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); EmitIntroSlide(0, gBattleTerrain); MarkBufferBankForExecution(gActiveBank); gBattleMainFunc = sub_8011384; @@ -1895,7 +1914,7 @@ void bc_801333C(void) hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); } } - gActiveBank = GetBankByPlayerAI(1); + gActiveBank = GetBankByIdentity(1); EmitDrawPartyStatusSummary(0, hpStatus, 0x80); MarkBufferBankForExecution(gActiveBank); @@ -1913,7 +1932,7 @@ void bc_801333C(void) hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); } } - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); EmitDrawPartyStatusSummary(0, hpStatus, 0x80); MarkBufferBankForExecution(gActiveBank); @@ -1948,7 +1967,7 @@ void bc_battle_begin_message(void) { if (gBattleExecBuffer == 0) { - gActiveBank = GetBankByPlayerAI(1); + gActiveBank = GetBankByIdentity(1); PrepareStringBattle(0, gActiveBank); gBattleMainFunc = sub_8011800; } @@ -1967,7 +1986,7 @@ void sub_8011800(void) { if (gBattleExecBuffer == 0) { - PrepareStringBattle(1, GetBankByPlayerAI(1)); + PrepareStringBattle(1, GetBankByIdentity(1)); gBattleMainFunc = sub_8011834; } } @@ -2019,7 +2038,7 @@ void sub_8011970(void) if (gBattleExecBuffer == 0) { if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - PrepareStringBattle(1, GetBankByPlayerAI(0)); + PrepareStringBattle(1, GetBankByIdentity(0)); gBattleMainFunc = sub_80119B4; } } @@ -2085,7 +2104,7 @@ void BattleBeginFirstTurn(void) for (j = i + 1; j < gNoOfAllBanks; j++) { if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 1) != 0) - sub_8012FBC(i, j); + SwapTurnOrder(i, j); } } } @@ -2199,8 +2218,8 @@ void BattleTurnPassed(void) gBattleCommunication[i] = 0; if (gBattleOutcome != 0) { - gFightStateTracker = 12; - gBattleMainFunc = sub_80138F0; + gCurrentActionFuncId = 12; + gBattleMainFunc = RunTurnActionsFunctions; return; } if (gBattleResults.battleTurnCounter < 0xFF) @@ -2323,8 +2342,8 @@ void sub_8012324(void) ewram16068arr(gActiveBank) = 6; if (!(gBattleTypeFlags & 0x40) && (r5 & 2) - && !(ewram160A6 & gBitTable[GetBankByPlayerAI(r5 ^ 2)]) - && gBattleCommunication[GetBankByPlayerAI(r5)] != 4) + && !(ewram160A6 & gBitTable[GetBankByIdentity(r5 ^ 2)]) + && gBattleCommunication[GetBankByIdentity(r5)] != 4) break; //_080123F8 if (ewram160A6 & gBitTable[gActiveBank]) @@ -2431,7 +2450,7 @@ _0801239C:\n\ beq _080123F8\n\ eors r5, r1\n\ adds r0, r5, 0\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ ldr r2, _08012444 @ =0x000160a6\n\ adds r1, r4, r2\n\ ldrb r1, [r1]\n\ @@ -2445,7 +2464,7 @@ _0801239C:\n\ bne _080123F8\n\ ldr r4, _0801244C @ =gBattleCommunication\n\ adds r0, r5, 0\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ lsls r0, 24\n\ lsrs r0, 24\n\ adds r0, r4\n\ @@ -3071,7 +3090,7 @@ _0801292C:\n\ eors r0, r1\n\ lsls r0, 24\n\ lsrs r0, 24\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ lsls r0, 24\n\ lsrs r0, 24\n\ adds r0, r4\n\ @@ -3621,7 +3640,7 @@ _08012DD2:\n\ bne _08012E06\n\ adds r0, r5, 0\n\ eors r0, r1\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ ldr r1, _08012E20 @ =gSharedMem\n\ ldr r2, _08012E24 @ =0x000160a6\n\ adds r1, r2\n\ @@ -3816,7 +3835,7 @@ _08012F80:\n\ cmp r0, r2\n\ bne _08012F90\n\ ldr r1, _08012FB4 @ =gBattleMainFunc\n\ - ldr r0, _08012FB8 @ =sub_80133C8\n\ + ldr r0, _08012FB8 @ =SetActionsAndBanksTurnOrder\n\ str r0, [r1]\n\ _08012F90:\n\ add sp, 0x1C\n\ @@ -3834,11 +3853,11 @@ _08012FA8: .4byte gActiveBank\n\ _08012FAC: .4byte gBattleCommunication\n\ _08012FB0: .4byte gNoOfAllBanks\n\ _08012FB4: .4byte gBattleMainFunc\n\ -_08012FB8: .4byte sub_80133C8\n\ +_08012FB8: .4byte SetActionsAndBanksTurnOrder\n\ .syntax divided\n"); } -void sub_8012FBC(u8 a, u8 b) +void SwapTurnOrder(u8 a, u8 b) { int temp; @@ -3995,3 +4014,257 @@ u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreMovePriorities) return strikesFirst; } + +void SetActionsAndBanksTurnOrder(void) +{ + s32 var = 0; + s32 i, j; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + gUnknown_02024A76[var] = gActionForBanks[gActiveBank]; + gTurnOrder[var] = gActiveBank; + var++; + } + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (gActionForBanks[gActiveBank] == ACTION_RUN) + { + var = 5; + break; + } + } + } + else + { + if (gActionForBanks[0] == ACTION_RUN) + { + gActiveBank = 0; + var = 5; + } + } + + if (var == 5) + { + gUnknown_02024A76[0] = gActionForBanks[gActiveBank]; + gTurnOrder[0] = gActiveBank; + var = 1; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (i != gActiveBank) + { + gUnknown_02024A76[var] = gActionForBanks[i]; + gTurnOrder[var] = i; + var++; + } + } + gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; + eFocusPunchBank = 0; + return; + } + else + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (gActionForBanks[gActiveBank] == ACTION_USE_ITEM || gActionForBanks[gActiveBank] == ACTION_SWITCH) + { + gUnknown_02024A76[var] = gActionForBanks[gActiveBank]; + gTurnOrder[var] = gActiveBank; + var++; + } + } + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (gActionForBanks[gActiveBank] != ACTION_USE_ITEM && gActionForBanks[gActiveBank] != ACTION_SWITCH) + { + gUnknown_02024A76[var] = gActionForBanks[gActiveBank]; + gTurnOrder[var] = gActiveBank; + var++; + } + } + for (i = 0; i < gNoOfAllBanks - 1; i++) + { + for (j = i + 1; j < gNoOfAllBanks; j++) + { + u8 bank1 = gTurnOrder[i]; + u8 bank2 = gTurnOrder[j]; + if (gUnknown_02024A76[i] != ACTION_USE_ITEM + && gUnknown_02024A76[j] != ACTION_USE_ITEM + && gUnknown_02024A76[i] != ACTION_SWITCH + && gUnknown_02024A76[j] != ACTION_SWITCH) + { + if (GetWhoStrikesFirst(bank1, bank2, FALSE)) + SwapTurnOrder(i, j); + } + } + } + } + } + gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; + eFocusPunchBank = 0; +} + +static void TurnValuesCleanUp(bool8 var0) +{ + s32 i; + u8 *dataPtr; + + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (var0) + { + gProtectStructs[gActiveBank].protected = 0; + gProtectStructs[gActiveBank].endured = 0; + } + else + { + dataPtr = (u8*)(&gProtectStructs[gActiveBank]); + for (i = 0; i < sizeof(struct ProtectStruct); i++) + dataPtr[i] = 0; + + if (gDisableStructs[gActiveBank].isFirstTurn) + gDisableStructs[gActiveBank].isFirstTurn--; + + if (gDisableStructs[gActiveBank].rechargeCounter) + { + gDisableStructs[gActiveBank].rechargeCounter--; + if (gDisableStructs[gActiveBank].rechargeCounter == 0) + gBattleMons[gActiveBank].status2 &= ~(STATUS2_RECHARGE); + } + } + + if (gDisableStructs[gActiveBank].substituteHP == 0) + gBattleMons[gActiveBank].status2 &= ~(STATUS2_SUBSTITUTE); + } + + gSideTimers[0].followmeTimer = 0; + gSideTimers[1].followmeTimer = 0; +} + +void SpecialStatusesClear(void) +{ + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + s32 i; + u8 *dataPtr = (u8*)(&gSpecialStatuses[gActiveBank]); + + for (i = 0; i < sizeof(struct SpecialStatus); i++) + dataPtr[i] = 0; + } +} + +void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) +{ + if (!(gHitMarker & HITMARKER_RUN)) + { + while (eFocusPunchBank < gNoOfAllBanks) + { + gActiveBank = gBankAttacker = eFocusPunchBank; + eFocusPunchBank++; + if (gChosenMovesByBanks[gActiveBank] == MOVE_FOCUS_PUNCH + && !(gBattleMons[gActiveBank].status1 & STATUS_SLEEP) + && !(gDisableStructs[gBankAttacker].truantCounter) + && !(gProtectStructs[gActiveBank].onlyStruggle)) + { + b_call_bc_move_exec(BattleScript_FocusPunchSetUp); + return; + } + } + } + + b_clear_atk_up_if_hit_flag_unless_enraged(); + gCurrentTurnActionNumber = 0; + { + // something stupid needed to match + u8 zero; + gCurrentActionFuncId = gUnknown_02024A76[(zero = 0)]; + } + + gDynamicBasePower = 0; + BATTLE_STRUCT->dynamicMoveType = 0; + gBattleMainFunc = RunTurnActionsFunctions; + gBattleCommunication[3] = 0; + gBattleCommunication[4] = 0; + eMultihitMoveEffect = 0; + ewram17130 = 0; +} + +static void RunTurnActionsFunctions(void) +{ + if (gBattleOutcome != 0) + gCurrentActionFuncId = 12; + + BATTLE_STRUCT->unk16057 = gCurrentTurnActionNumber; + gUnknown_081FA640[gCurrentActionFuncId](); + + if (gCurrentTurnActionNumber >= gNoOfAllBanks) // everyone did their actions, turn finished + { + gHitMarker &= ~(HITMARKER_x100000); + gBattleMainFunc = gUnknown_081FA678[gBattleOutcome & 0x7F]; + } + else + { + if (BATTLE_STRUCT->unk16057 != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another bank + { + gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING); + gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE); + } + } +} + +void HandleEndTurn_BattleWon(void) +{ + gCurrentActionFuncId = 0; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gBattleTextBuff1[0] = gBattleOutcome; + gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1); + gBattlescriptCurrInstr = gUnknown_081D8E02; + gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); + } + else if (gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) + { + gBattlescriptCurrInstr = gUnknown_081D8E0D; + } + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) + { + BattleMusicStop(); + gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon; + + switch (gTrainers[gTrainerBattleOpponent].trainerClass) + { + case TRAINER_CLASS_ELITE_FOUR: + case TRAINER_CLASS_CHAMPION: + PlayBGM(BGM_KACHI5); + break; + case TRAINER_CLASS_TEAM_AQUA: + case TRAINER_CLASS_TEAM_MAGMA: + case TRAINER_CLASS_AQUA_ADMIN: + case TRAINER_CLASS_AQUA_LEADER: + case TRAINER_CLASS_MAGMA_ADMIN: + case TRAINER_CLASS_MAGMA_LEADER: + PlayBGM(BGM_KACHI4); + break; + case TRAINER_CLASS_LEADER: + PlayBGM(BGM_KACHI3); + break; + default: + PlayBGM(BGM_KACHI1); + break; + } + } + else + { + gBattlescriptCurrInstr = BattleScript_PayDayMoneyAndPickUpItems; + } + + gBattleMainFunc = sub_8013C9C; +} diff --git a/src/battle/battle_3.c b/src/battle/battle_3.c index e5a730598..cfa188fa4 100644 --- a/src/battle/battle_3.c +++ b/src/battle/battle_3.c @@ -50,7 +50,7 @@ extern u8 gTakenDmgBanks[4]; extern u8 gBattleMoveFlags; extern u8 gLastUsedAbility; extern u8 gBattleTextBuff2[]; -extern u8 gFightStateTracker; +extern u8 gCurrentActionFuncId; extern struct BattleEnigmaBerry gEnigmaBerries[4]; extern u8 gUnknown_02024BE5; extern u8 gCurrMovePos; @@ -69,7 +69,7 @@ extern const u8 gStatusConditionString_LoveJpn[]; extern const BattleCmdFunc gBattleScriptingCommandsTable[]; u8 IsImprisoned(u8 bank, u16 move); -u8 GetBankByPlayerAI(u8 ID); +u8 GetBankByIdentity(u8 ID); u8 GetBankIdentity(u8 bank); u8 GetBankSide(u8 bank); void b_call_bc_move_exec(u8* BS_ptr); @@ -320,9 +320,9 @@ bool8 AreAllMovesUnusable(void) gProtectStructs[gActiveBank].onlyStruggle = 1; gUnknown_02024C1C[gActiveBank] = BattleScript_NoMovesLeft; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - gBattleBufferB[gActiveBank][3] = GetBankByPlayerAI((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2)); + gBattleBufferB[gActiveBank][3] = GetBankByIdentity((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2)); else - gBattleBufferB[gActiveBank][3] = GetBankByPlayerAI(GetBankIdentity(gActiveBank) ^ 1); + gBattleBufferB[gActiveBank][3] = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ 1); } else gProtectStructs[gActiveBank].onlyStruggle = 0; @@ -380,7 +380,7 @@ u8 UpdateTurnCounters(void) for (j = i + 1; j < gNoOfAllBanks; j++) { if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 0)) - sub_8012FBC(i, j); + SwapTurnOrder(i, j); } } BATTLE_STRUCT->turncountersTracker++; @@ -392,7 +392,7 @@ u8 UpdateTurnCounters(void) if (gSideAffecting[sideBank] & SIDE_STATUS_REFLECT) { - if (--gSideTimer[sideBank].reflectTimer == 0) + if (--gSideTimers[sideBank].reflectTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT; @@ -421,7 +421,7 @@ u8 UpdateTurnCounters(void) gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; if (gSideAffecting[sideBank] & SIDE_STATUS_LIGHTSCREEN) { - if (--gSideTimer[sideBank].lightscreenTimer == 0) + if (--gSideTimers[sideBank].lightscreenTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN; b_call_bc_move_exec(BattleScript_SideStatusWoreOff); @@ -448,7 +448,7 @@ u8 UpdateTurnCounters(void) while (BATTLE_STRUCT->turnSideTracker < 2) { gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; - if (gSideTimer[sideBank].mistTimer && --gSideTimer[sideBank].mistTimer == 0) + if (gSideTimers[sideBank].mistTimer && --gSideTimers[sideBank].mistTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST; b_call_bc_move_exec(BattleScript_SideStatusWoreOff); @@ -476,7 +476,7 @@ u8 UpdateTurnCounters(void) gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; if (gSideAffecting[sideBank] & SIDE_STATUS_SAFEGUARD) { - if (--gSideTimer[sideBank].safeguardTimer == 0) + if (--gSideTimers[sideBank].safeguardTimer == 0) { gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD; b_call_bc_move_exec(BattleScript_SafeguardEnds); @@ -1363,14 +1363,14 @@ bool8 sub_8018018(u8 bank, u8 r1, u8 r2) { if (GetBankSide(bank) == 1) { - r7 = GetBankByPlayerAI(1); - r6 = GetBankByPlayerAI(3); + r7 = GetBankByIdentity(1); + r6 = GetBankByIdentity(3); party = gEnemyParty; } else { - r7 = GetBankByPlayerAI(0); - r6 = GetBankByPlayerAI(2); + r7 = GetBankByIdentity(0); + r6 = GetBankByIdentity(2); party = gPlayerParty; } if (r1 == 6) @@ -2053,15 +2053,15 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) { u8 target2; side = (GetBankIdentity(i) ^ 1) & 1; - target1 = GetBankByPlayerAI(side); - target2 = GetBankByPlayerAI(side + 2); + target1 = GetBankByIdentity(side); + target2 = GetBankByIdentity(side + 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) { //_080199AE - gActiveBank = GetBankByPlayerAI(((Random() & 1) * 2) | side); + gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | side); gBattleMons[i].ability = gBattleMons[gActiveBank].ability; gLastUsedAbility = gBattleMons[gActiveBank].ability; effect++; @@ -2256,7 +2256,7 @@ void b_call_bc_move_exec(u8* BS_ptr) gBattlescriptCurrInstr = BS_ptr; B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; gBattleMainFunc = sub_8013F54; - gFightStateTracker = 0; + gCurrentActionFuncId = 0; } void b_push_move_exec(u8* BS_ptr) @@ -3028,14 +3028,14 @@ void unref_sub_801B40C(void) { if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank + 2]) { - gSideTimer[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4); - gSideTimer[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; + gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4); + gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4; } if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank + 2] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank]) { - gSideTimer[GetBankIdentity(bank) & 1].field3 = (bank + 2) | ((bank) << 4); - gSideTimer[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; + gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank + 2) | ((bank) << 4); + gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4; } bank++; @@ -3067,8 +3067,8 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target { case 0: side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp) - targetBank = gSideTimer[side].followmeTarget; + if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + targetBank = gSideTimers[side].followmeTarget; else { side = GetBankSide(gBankAttacker); @@ -3090,35 +3090,35 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target case 8: case 32: case 64: - targetBank = GetBankByPlayerAI((GetBankIdentity(gBankAttacker) & 1) ^ 1); + targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); if (gAbsentBankFlags & gBitTable[targetBank]) targetBank ^= 2; break; case 4: side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp) - targetBank = gSideTimer[side].followmeTarget; + if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + targetBank = gSideTimers[side].followmeTarget; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & 4) { if (GetBankSide(gBankAttacker) == 0) { if (Random() & 1) - targetBank = GetBankByPlayerAI(1); + targetBank = GetBankByIdentity(1); else - targetBank = GetBankByPlayerAI(3); + targetBank = GetBankByIdentity(3); } else { if (Random() & 1) - targetBank = GetBankByPlayerAI(0); + targetBank = GetBankByIdentity(0); else - targetBank = GetBankByPlayerAI(2); + targetBank = GetBankByIdentity(2); } if (gAbsentBankFlags & gBitTable[targetBank]) targetBank ^= 2; } else - targetBank = GetBankByPlayerAI((GetBankIdentity(gBankAttacker) & 1) ^ 1); + targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); break; case 2: case 16: diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 0c147e471..d9789f76d 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -58,7 +58,7 @@ extern u8 gBankAttacker; extern u8 gBankTarget; extern u8* gBattlescriptCurrInstr; extern u8 gCurrMovePos; -extern u8 gFightStateTracker; +extern u8 gCurrentActionFuncId; extern u32 gHitMarker; extern u8 gBattleMoveFlags; extern u8 gBattleCommunication[]; @@ -94,7 +94,7 @@ extern u8 gActionForBanks[4]; extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch extern u16 gUnknown_030041B0; extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one -extern u8 gCurrentMoveTurn; +extern u8 gCurrentTurnActionNumber; extern u16 gTrappingMoves[]; //extern functions @@ -129,7 +129,7 @@ u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); u16 SpeciesToNationalPokedexNum(u16 species); u8 sub_803FC34(u8 bank); u16 sub_803FBFC(u8 a); -u8 GetBankByPlayerAI(u8 ID); +u8 GetBankByIdentity(u8 ID); void sub_8012258(u8); void sub_80157C4(u8 bank); //update sent pokes in battle //MonTryLearningNewMove teach poke a move @@ -1028,7 +1028,7 @@ static void atk00_attackcanceler(void) int i; if (gBattleOutcome) { - gFightStateTracker = 0xC; + gCurrentActionFuncId = 0xC; return; } if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) @@ -2518,7 +2518,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) } else { - if (BankGetTurnOrder(gEffectBank) > gCurrentMoveTurn) + if (BankGetTurnOrder(gEffectBank) > gCurrentTurnActionNumber) gBattleMons[gEffectBank].status2 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; gBattlescriptCurrInstr++; return; } @@ -3861,7 +3861,7 @@ _0801ED14: .4byte BattleScript_FlinchPrevention\n\ _0801ED18:\n\ adds r0, r2, 0\n\ bl BankGetTurnOrder\n\ - ldr r1, _0801ED54 @ =gCurrentMoveTurn\n\ + ldr r1, _0801ED54 @ =gCurrentTurnActionNumber\n\ lsls r0, 24\n\ lsrs r0, 24\n\ ldrb r1, [r1]\n\ @@ -3887,7 +3887,7 @@ _0801ED2E:\n\ str r1, [r2]\n\ bl _0801F5DC\n\ .align 2, 0\n\ -_0801ED54: .4byte gCurrentMoveTurn\n\ +_0801ED54: .4byte gCurrentTurnActionNumber\n\ _0801ED58: .4byte gStatusFlagsForMoveEffects\n\ _0801ED5C: .4byte gBattleCommunication\n\ _0801ED60:\n\ @@ -7290,14 +7290,14 @@ static void atk3D_end(void) { gBattleMoveFlags = 0; gActiveBank = 0; - gFightStateTracker = 0xB; + gCurrentActionFuncId = 0xB; } static void atk3E_end2(void) { //not much difference between this and 3D. It's more apparent in Emerald gActiveBank = 0; - gFightStateTracker = 0xB; + gCurrentActionFuncId = 0xB; } static void atk3F_end3(void) //pops the main function stack @@ -7467,7 +7467,7 @@ static void atk48_playstatchangeanimation(void) if (!(T2_READ_8(gBattlescriptCurrInstr + 3))) { u8 ability; - if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer) + if (gSideTimers[GetBankIdentity(gActiveBank) & 1].mistTimer) continue; ability = gBattleMons[gActiveBank].ability; if (ability == ABILITY_CLEAR_BODY || ability == ABILITY_WHITE_SMOKE || (ability == ABILITY_KEEN_EYE && curr_stat == 6) || (ability == ABILITY_HYPER_CUTTER && curr_stat == 1)) @@ -7602,7 +7602,7 @@ _0802167C:\n\ lsls r0, r1, 1\n\ adds r0, r1\n\ lsls r0, 2\n\ - ldr r1, _08021704 @ =gSideTimer\n\ + ldr r1, _08021704 @ =gSideTimers\n\ adds r0, r1\n\ ldrb r0, [r0, 0x2]\n\ ldr r3, [sp]\n\ @@ -7665,7 +7665,7 @@ _080216E4:\n\ b _08021770\n\ .align 2, 0\n\ _08021700: .4byte gActiveBank\n\ -_08021704: .4byte gSideTimer\n\ +_08021704: .4byte gSideTimers\n\ _08021708: .4byte gBattleMons\n\ _0802170C: .4byte gBattlescriptCurrInstr\n\ _08021710:\n\ @@ -9154,7 +9154,7 @@ _080221C0:\n\ eors r0, r1\n\ lsls r0, 24\n\ lsrs r0, 24\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ lsls r0, 24\n\ lsrs r2, r0, 24\n\ ldr r1, _080222CC @ =gBattleMons\n\ @@ -9457,18 +9457,18 @@ static void atk4F_jumpifcantswitch(void) { if (GetBankSide(gActiveBank) == 1) { - r7 = GetBankByPlayerAI(1); + r7 = GetBankByIdentity(1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBankByPlayerAI(3); + to_cmp = GetBankByIdentity(3); else to_cmp = r7; party = gEnemyParty; } else { - r7 = GetBankByPlayerAI(0); + r7 = GetBankByIdentity(0); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBankByPlayerAI(2); + to_cmp = GetBankByIdentity(2); else to_cmp = r7; party = gPlayerParty; @@ -10528,7 +10528,7 @@ _080232C4:\n\ eors r0, r1\n\ lsls r0, 24\n\ lsrs r0, 24\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ ldr r4, _08023310 @ =gActiveBank\n\ strb r0, [r4]\n\ ldr r0, _08023314 @ =gAbsentBankFlags\n\ @@ -10632,7 +10632,7 @@ static void atk52_switchineffects(void) gSideAffecting[GetBankSide(gActiveBank)] |= SIDE_STATUS_SPIKES_DAMAGED; - spikesDmg = (5 - gSideTimer[GetBankSide(gActiveBank)].spikesAmount) * 2; + spikesDmg = (5 - gSideTimers[GetBankSide(gActiveBank)].spikesAmount) * 2; gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / (spikesDmg); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -10690,9 +10690,9 @@ static void atk52_switchineffects(void) static void atk53_trainerslidein(void) { if (!T2_READ_8(gBattlescriptCurrInstr + 1)) - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); else - gActiveBank = GetBankByPlayerAI(1); + gActiveBank = GetBankByIdentity(1); EmitTrainerSlide(0); MarkBufferBankForExecution(gActiveBank); @@ -10725,7 +10725,7 @@ static void atk56_playfaintcry(void) static void atk57(void) { - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); Emitcmd55(0, gBattleOutcome); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 1; @@ -10758,12 +10758,12 @@ void atk59_handlelearnnewmove(void) } else { - gActiveBank = GetBankByPlayerAI(0); + gActiveBank = GetBankByIdentity(0); if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) //what is else if { - gActiveBank = GetBankByPlayerAI(2); + gActiveBank = GetBankByIdentity(2); if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret); } @@ -11907,7 +11907,7 @@ static void atk6D_resetsentmonsvalue(void) static void atk6E_setatktoplayer0(void) { - gBankAttacker = GetBankByPlayerAI(0); + gBankAttacker = GetBankByIdentity(0); gBattlescriptCurrInstr++; } @@ -12020,8 +12020,8 @@ static void atk76_various(void) u8 side; gBankAttacker = gBankTarget; side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp) - gBankTarget = gSideTimer[side].followmeTarget; + if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + gBankTarget = gSideTimers[side].followmeTarget; else gBankTarget = gActiveBank; } @@ -12080,7 +12080,7 @@ static void atk77_setprotectlike(void) //protect and endure if (last_move != MOVE_PROTECT && last_move != MOVE_DETECT && last_move != MOVE_ENDURE) gDisableStructs[gBankAttacker].protectUses = 0; - if (gCurrentMoveTurn == (gNoOfAllBanks - 1)) + if (gCurrentTurnActionNumber == (gNoOfAllBanks - 1)) not_last_turn = 0; if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] > Random() && not_last_turn) @@ -12266,7 +12266,7 @@ static void atk7E_setreflect(void) else { gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_REFLECT; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].reflectTimer = 5; + gSideTimers[GetBankIdentity(gBankAttacker) & 1].reflectTimer = 5; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = 2; else @@ -12502,7 +12502,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) if ((statchanger << 0x18) < 0) //stat decrease { - if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer && !r9 && gCurrentMove != MOVE_CURSE) + if (gSideTimers[GetBankIdentity(gActiveBank) & 1].mistTimer && !r9 && gCurrentMove != MOVE_CURSE) { if (flags == 1) { @@ -12728,7 +12728,7 @@ _08025E88:\n\ blt _08025EAC\n\ b _080261B0\n\ _08025EAC:\n\ - ldr r4, _08025F04 @ =gSideTimer\n\ + ldr r4, _08025F04 @ =gSideTimers\n\ ldr r1, _08025EF8 @ =gActiveBank\n\ ldrb r0, [r1]\n\ bl GetBankIdentity\n\ @@ -12769,7 +12769,7 @@ _08025EAC:\n\ _08025EF8: .4byte gActiveBank\n\ _08025EFC: .4byte gBankTarget\n\ _08025F00: .4byte gBattleTextBuff1\n\ -_08025F04: .4byte gSideTimer\n\ +_08025F04: .4byte gSideTimers\n\ _08025F08: .4byte gCurrentMove\n\ _08025F0C: .4byte gSpecialStatuses\n\ _08025F10: .4byte gBattlescriptCurrInstr\n\ @@ -13488,7 +13488,7 @@ static void atk92_setlightscreen(void) else { gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_LIGHTSCREEN; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].lightscreenTimer = 5; + gSideTimers[GetBankIdentity(gBankAttacker) & 1].lightscreenTimer = 5; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = 4; else @@ -14034,7 +14034,7 @@ static void atk98_updatestatusicon(void) } if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (!(gAbsentBankFlags & gBitTable[gActiveBank])) { EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); @@ -14047,14 +14047,14 @@ static void atk98_updatestatusicon(void) static void atk99_setmist(void) { - if (gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer) + if (gSideTimers[GetBankIdentity(gBankAttacker) & 1].mistTimer) { gBattleMoveFlags |= MOVESTATUS_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = 1; } else { - gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer = 5; + gSideTimers[GetBankIdentity(gBankAttacker) & 1].mistTimer = 5; gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_MIST; gBattleCommunication[MULTISTRING_CHOOSER] = 0; } @@ -14315,8 +14315,8 @@ static void atkA1_counterdamagecalculator(void) if (gProtectStructs[gBankAttacker].physicalDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp) { gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2; - if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp) - gBankTarget = gSideTimer[def_side].followmeTarget; + if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp) + gBankTarget = gSideTimers[def_side].followmeTarget; else gBankTarget = gProtectStructs[gBankAttacker].physicalBank; gBattlescriptCurrInstr += 5; @@ -14335,8 +14335,8 @@ static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the ph if (gProtectStructs[gBankAttacker].specialDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp) { gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2; - if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp) - gBankTarget = gSideTimer[def_side].followmeTarget; + if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp) + gBankTarget = gSideTimers[def_side].followmeTarget; else gBankTarget = gProtectStructs[gBankAttacker].specialBank; gBattlescriptCurrInstr += 5; @@ -14948,7 +14948,7 @@ static void atkAE_healpartystatus(void) gBattleCommunication[MULTISTRING_CHOOSER] |= 1; } - gActiveBank = BATTLE_STRUCT->scriptingActive = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = BATTLE_STRUCT->scriptingActive = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) { if (gBattleMons[gActiveBank].ability != ABILITY_SOUNDPROOF) @@ -14986,7 +14986,7 @@ static void atkAE_healpartystatus(void) to_heal = 0x3F; gBattleMons[gBankAttacker].status1 = zero2; - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) gBattleMons[gActiveBank].status1 = 0; @@ -15018,7 +15018,7 @@ static void atkAF_cursetarget(void) static void atkB0_trysetspikes(void) { u8 side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].spikesAmount == 3) + if (gSideTimers[side].spikesAmount == 3) { gSpecialStatuses[gBankAttacker].flag20 = 1; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -15026,7 +15026,7 @@ static void atkB0_trysetspikes(void) else { gSideAffecting[side] |= SIDE_STATUS_SPIKES; - gSideTimer[side].spikesAmount++; + gSideTimers[side].spikesAmount++; gBattlescriptCurrInstr += 5; } } @@ -15167,7 +15167,7 @@ static void atkB8_setsafeguard(void) else { gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_SAFEGUARD; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].safeguardTimer = 5; + gSideTimers[GetBankIdentity(gBankAttacker) & 1].safeguardTimer = 5; gBattleCommunication[MULTISTRING_CHOOSER] = 5; } gBattlescriptCurrInstr++; @@ -15234,16 +15234,16 @@ static void atkBA_jumpifnopursuitswitchdmg(void) if (gMultiHitCounter == 1) { if (GetBankSide(gBankAttacker) == 0) - gBankTarget = GetBankByPlayerAI(1); + gBankTarget = GetBankByIdentity(1); else - gBankTarget = GetBankByPlayerAI(0); + gBankTarget = GetBankByIdentity(0); } else { if (GetBankSide(gBankAttacker) == 0) - gBankTarget = GetBankByPlayerAI(3); + gBankTarget = GetBankByIdentity(3); else - gBankTarget = GetBankByPlayerAI(2); + gBankTarget = GetBankByIdentity(2); } if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram16010arr(gBankTarget) && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) @@ -15334,7 +15334,7 @@ static void atkBE_rapidspinfree(void) //rapid spin else if (gSideAffecting[GetBankSide(gBankAttacker)] & SIDE_STATUS_SPIKES) { gSideAffecting[GetBankSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES); - gSideTimer[GetBankSide(gBankAttacker)].spikesAmount = 0; + gSideTimers[GetBankSide(gBankAttacker)].spikesAmount = 0; b_movescr_stack_push_cursor(); gBattlescriptCurrInstr = BattleScript_SpikesFree; } @@ -15935,8 +15935,8 @@ static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento static void atkCA_setforcedtarget(void) //follow me { - gSideTimer[GetBankSide(gBankAttacker)].followmeTimer = 1; - gSideTimer[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker; + gSideTimers[GetBankSide(gBankAttacker)].followmeTimer = 1; + gSideTimers[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker; gBattlescriptCurrInstr++; } @@ -16004,7 +16004,7 @@ static void atkD0_settaunt(void) static void atkD1_trysethelpinghand(void) { - gBankTarget = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gBankTarget]) && !gProtectStructs[gBankAttacker].helpingHand && !gProtectStructs[gBankTarget].helpingHand) { @@ -16774,7 +16774,7 @@ static void atkDF_trysetmagiccoat(void) { gBankTarget = gBankAttacker; gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn + if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) //last turn gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { @@ -16786,7 +16786,7 @@ static void atkDF_trysetmagiccoat(void) static void atkE0_trysetsnatch(void) { gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn + if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) //last turn gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { @@ -17011,7 +17011,7 @@ static void atkEB_settypetoterrain(void) static void atkEC_pursuitrelated(void) { - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank]) && gActionForBanks[gActiveBank] == 0 && gChosenMovesByBanks[gActiveBank] == MOVE_PURSUIT) { gUnknown_02024A76[gActiveBank] = 11; @@ -17039,12 +17039,12 @@ static void atkED_snatchsetbanks(void) static void atkEE_removelightscreenreflect(void) //brick break { u8 side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].reflectTimer || gSideTimer[side].lightscreenTimer) + if (gSideTimers[side].reflectTimer || gSideTimers[side].lightscreenTimer) { gSideAffecting[side] &= ~(SIDE_STATUS_REFLECT); gSideAffecting[side] &= ~(SIDE_STATUS_LIGHTSCREEN); - gSideTimer[side].reflectTimer = 0; - gSideTimer[side].lightscreenTimer = 0; + gSideTimers[side].reflectTimer = 0; + gSideTimers[side].lightscreenTimer = 0; BATTLE_STRUCT->animTurn = 1; BATTLE_STRUCT->animTargetsHit = 1; } @@ -17428,11 +17428,11 @@ static void atkF5_removeattackerstatus1(void) static void atkF6_finishaction(void) { - gFightStateTracker = 0xC; + gCurrentActionFuncId = 0xC; } static void atkF7_finishturn(void) { - gFightStateTracker = 0xC; - gCurrentMoveTurn = gNoOfAllBanks; + gCurrentActionFuncId = 0xC; + gCurrentTurnActionNumber = gNoOfAllBanks; } diff --git a/src/battle/battle_7.c b/src/battle/battle_7.c index e11971606..1c79d7ebf 100644 --- a/src/battle/battle_7.c +++ b/src/battle/battle_7.c @@ -795,7 +795,7 @@ void sub_80324F8(struct Pokemon *pkmn, u8 b) void BattleMusicStop(void) { - u8 r4 = GetBankByPlayerAI(0); + u8 r4 = GetBankByIdentity(0); ewram17800[r4].unk0_1 = 0; if (IsDoubleBattle()) @@ -815,8 +815,8 @@ void sub_8032638(void) { if (gMain.inBattle) { - u8 r8 = GetBankByPlayerAI(0); - u8 r9 = GetBankByPlayerAI(2); + u8 r8 = GetBankByIdentity(0); + u8 r9 = GetBankByIdentity(2); u8 r4 = pokemon_order_func(gBattlePartyID[r8]); u8 r5 = pokemon_order_func(gBattlePartyID[r9]); @@ -857,12 +857,12 @@ void sub_80327CC(void) u8 r5; LoadCompressedObjectPic(&gUnknown_081FAF24); - r5 = GetBankByPlayerAI(1); + r5 = GetBankByIdentity(1); ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, GetBankPosition(r5, 0), GetBankPosition(r5, 1) + 32, 0xC8); gSprites[ewram17810[r5].unk7].data[0] = r5; if (IsDoubleBattle()) { - r5 = GetBankByPlayerAI(3); + r5 = GetBankByIdentity(3); ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, GetBankPosition(r5, 0), GetBankPosition(r5, 1) + 32, 0xC8); gSprites[ewram17810[r5].unk7].data[0] = r5; } diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c index 6b892ea7a..977e91f5c 100644 --- a/src/battle/battle_ai.c +++ b/src/battle/battle_ai.c @@ -1321,7 +1321,7 @@ static void BattleAICmd_count_alive_pokemon(void) u32 status; var = gBattlePartyID[index]; status = GetBankIdentity(index) ^ 2; - var2 = gBattlePartyID[GetBankByPlayerAI(status)]; + var2 = gBattlePartyID[GetBankByIdentity(status)]; } else { diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index 3097f1a0e..c35434df0 100644 --- a/src/battle/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -108,17 +108,17 @@ void sub_80A7FA0(u8 taskId) switch (gBattleAnimArgs[0]) { case 4: - side = GetBankByPlayerAI(0); + side = GetBankByIdentity(0); break; case 5: - side = GetBankByPlayerAI(2); + side = GetBankByIdentity(2); break; case 6: - side = GetBankByPlayerAI(1); + side = GetBankByIdentity(1); break; case 7: default: - side = GetBankByPlayerAI(3); + side = GetBankByIdentity(3); break; } if (IsAnimBankSpriteVisible(side) == FALSE) diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index 54bb9d7f9..477b600ac 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -98,7 +98,7 @@ extern void sub_80324BC(); extern void BufferStringBattle(); extern void sub_80331D0(void); extern void sub_8036B0C(void); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern u8 sub_8036CD4(void); extern void sub_80330C8(void); extern void sub_8043D84(); @@ -1451,9 +1451,9 @@ void OpponentHandlecmd20(void) gBankTarget = gActiveBank; if (gBattleMoves[r5->moves[r4]].target & 8) { - gBankTarget = GetBankByPlayerAI(0); + gBankTarget = GetBankByIdentity(0); if (gAbsentBankFlags & gBitTable[gBankTarget]) - gBankTarget = GetBankByPlayerAI(2); + gBankTarget = GetBankByIdentity(2); } r4 |= gBankTarget << 8; Emitcmd33(1, 10, r4); @@ -1479,13 +1479,13 @@ void OpponentHandlecmd20(void) } else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - u16 r2 = GetBankByPlayerAI(Random() & 2) << 8; + u16 r2 = GetBankByIdentity(Random() & 2) << 8; Emitcmd33(1, 10, r4 | r2); } else { - u16 r2 = GetBankByPlayerAI(0) << 8; + u16 r2 = GetBankByIdentity(0) << 8; Emitcmd33(1, 10, r4 | r2); } @@ -1561,7 +1561,7 @@ _08035494:\n\ cmp r0, 0\n\ beq _080354CE\n\ movs r0, 0\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ ldr r5, _080354EC @ =gBankTarget\n\ strb r0, [r5]\n\ ldr r0, _080354F0 @ =gAbsentBankFlags\n\ @@ -1575,7 +1575,7 @@ _08035494:\n\ cmp r1, 0\n\ beq _080354CE\n\ movs r0, 0x2\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ strb r0, [r5]\n\ _080354CE:\n\ ldr r0, _080354EC @ =gBankTarget\n\ @@ -1640,7 +1640,7 @@ _0803553C:\n\ lsls r1, 24\n\ lsrs r1, 24\n\ adds r0, r1, 0\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ adds r2, r0, 0\n\ lsls r2, 24\n\ lsrs r2, 16\n\ @@ -1653,7 +1653,7 @@ _0803553C:\n\ _0803556C: .4byte gBattleTypeFlags\n\ _08035570:\n\ movs r0, 0\n\ - bl GetBankByPlayerAI\n\ + bl GetBankByIdentity\n\ adds r2, r0, 0\n\ lsls r2, 24\n\ lsrs r2, 16\n\ @@ -1692,13 +1692,13 @@ void OpponentHandlecmd22(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { - r5 = GetBankByPlayerAI(1); + r5 = GetBankByIdentity(1); r6 = r5; } else { - r6 = GetBankByPlayerAI(1); - r5 = GetBankByPlayerAI(3); + r6 = GetBankByIdentity(1); + r5 = GetBankByIdentity(3); } for (r4 = 0; r4 < 6; r4++) { diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 70773473d..62a38311a 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -118,7 +118,7 @@ extern void sub_8031F24(void); extern void sub_80324BC(); extern u8 sub_8031720(); extern void bx_wait_t1(void); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern void sub_802DE10(void); extern void sub_80105EC(struct Sprite *); extern void sub_802D274(void); @@ -167,7 +167,7 @@ extern const u8 BattleText_LinkStandby[]; extern void dp11b_obj_instanciate(u8, u8, s8, s8); extern u8 GetBankIdentity(u8); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern void dp11b_obj_free(u8, u8); extern void sub_8010520(struct Sprite *); extern void sub_8010574(struct Sprite *); @@ -445,7 +445,7 @@ void sub_802C098(void) { if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && GetBankIdentity(gActiveBank) == 2 - && !(gAbsentBankFlags & gBitTable[GetBankByPlayerAI(0)]) + && !(gAbsentBankFlags & gBitTable[GetBankByIdentity(0)]) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { if (gBattleBufferA[gActiveBank][1] == 1) @@ -529,7 +529,7 @@ void sub_802C2EC(void) i--; if (i < 0) i = 3; - gUnknown_03004344 = GetBankByPlayerAI(arr[i]); + gUnknown_03004344 = GetBankByIdentity(arr[i]); } while(gUnknown_03004344 == gNoOfAllBanks); i = 0; switch (GetBankIdentity(gUnknown_03004344)) @@ -576,7 +576,7 @@ void sub_802C2EC(void) i++; if (i > 3) i = 0; - gUnknown_03004344 = GetBankByPlayerAI(arr[i]); + gUnknown_03004344 = GetBankByIdentity(arr[i]); } while (gUnknown_03004344 == gNoOfAllBanks); i = 0; switch (GetBankIdentity(gUnknown_03004344)) @@ -636,7 +636,7 @@ void sub_802C68C(void) if (r4 & 0x10) gUnknown_03004344 = gActiveBank; else - gUnknown_03004344 = GetBankByPlayerAI((GetBankIdentity(gActiveBank) & 1) ^ 1); + gUnknown_03004344 = GetBankByIdentity((GetBankIdentity(gActiveBank) & 1) ^ 1); if (gBattleBufferA[gActiveBank][1] == 0) { @@ -668,10 +668,10 @@ void sub_802C68C(void) gBattleBankFunc[gActiveBank] = sub_802C2EC; if (r4 & 0x12) gUnknown_03004344 = gActiveBank; - else if (gAbsentBankFlags & gBitTable[GetBankByPlayerAI(1)]) - gUnknown_03004344 = GetBankByPlayerAI(3); + else if (gAbsentBankFlags & gBitTable[GetBankByIdentity(1)]) + gUnknown_03004344 = GetBankByIdentity(3); else - gUnknown_03004344 = GetBankByPlayerAI(1); + gUnknown_03004344 = GetBankByIdentity(1); gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520; } } @@ -2458,7 +2458,7 @@ void PlayerHandlecmd12(void) { ewram17840.unk8 = 4; gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 3); gBattleBankFunc[gActiveBank] = bx_wait_t1; } @@ -2468,7 +2468,7 @@ void PlayerHandleBallThrow(void) ewram17840.unk8 = var; gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 3); gBattleBankFunc[gActiveBank] = bx_wait_t1; } diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c index 6f6286945..37c58f951 100644 --- a/src/battle/battle_controller_safari.c +++ b/src/battle/battle_controller_safari.c @@ -40,7 +40,7 @@ extern u16 gUnknown_02024DE8; extern u8 gBattleOutcome; extern u8 GetBankSide(u8); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern u8 GetBankIdentity(u8); extern void LoadPlayerTrainerBankSprite(); extern u8 sub_8079E90(); @@ -423,7 +423,7 @@ void SafariHandlecmd12(void) { ewram17840.unk8 = 4; gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4); gBattleBankFunc[gActiveBank] = bx_wait_t6; } @@ -433,7 +433,7 @@ void SafariHandleBallThrow(void) ewram17840.unk8 = var; gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4); gBattleBankFunc[gActiveBank] = bx_wait_t6; } diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c index 8ace11fc1..be40f968c 100644 --- a/src/battle/battle_controller_wally.c +++ b/src/battle/battle_controller_wally.c @@ -75,7 +75,7 @@ extern void PlayerHandlecmd1(void); extern void LoadPlayerTrainerBankSprite(); extern u8 GetBankIdentity(u8); extern void sub_80313A0(struct Sprite *); -extern u8 GetBankByPlayerAI(u8); +extern u8 GetBankByIdentity(u8); extern u8 sub_8031720(); extern void DoMoveAnim(); extern void sub_80326EC(); @@ -1149,7 +1149,7 @@ void WallyHandlecmd12(void) { ewram17840.unk8 = 4; gDoingBattleAnim = TRUE; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4); gBattleBankFunc[gActiveBank] = bx_wait_t5; } @@ -1159,7 +1159,7 @@ void WallyHandleBallThrow(void) ewram17840.unk8 = val; gDoingBattleAnim = TRUE; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4); gBattleBankFunc[gActiveBank] = bx_wait_t5; } diff --git a/src/battle/battle_message.c b/src/battle/battle_message.c index 4ac8c7a6f..d8efc09c5 100644 --- a/src/battle/battle_message.c +++ b/src/battle/battle_message.c @@ -199,7 +199,7 @@ s32 sub_803FC34(u16); void get_trainer_name(u8* dst); u8 get_trainer_class_name_index(void); u8 GetMultiplayerId(void); -u8 GetBankByPlayerAI(u8 ID); +u8 GetBankByIdentity(u8 ID); u8 GetBankSide(u8 bank); u8 GetBankIdentity(u8 bank); #ifdef GERMAN @@ -572,22 +572,22 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) toCpy = gBattleTextBuff3; break; case 2: // first player poke name - GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(0)]], MON_DATA_NICKNAME, text); + GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(0)]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case 3: // first enemy poke name - GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(1)]], MON_DATA_NICKNAME, text); + GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(1)]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case 4: // second player poke name - GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(2)]], MON_DATA_NICKNAME, text); + GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(2)]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case 5: // second enemy poke name - GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(3)]], MON_DATA_NICKNAME, text); + GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(3)]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; @@ -612,13 +612,13 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) toCpy = text; break; case 10: // attacker name with prefix, only bank 0/1 - HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1)]) + HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1)]) break; case 11: // attacker partner name, only bank 0/1 if (GetBankSide(gBankAttacker) == 0) - GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); + GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); else - GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); + GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; diff --git a/src/battle/battle_party_menu.c b/src/battle/battle_party_menu.c index d4dcae0ca..7bce00d82 100644 --- a/src/battle/battle_party_menu.c +++ b/src/battle/battle_party_menu.c @@ -122,7 +122,7 @@ static void sub_8094998(u8 arg[3], u8 player_number) if (!IsDoubleBattle()) { pos = 1; - *temp = gBattlePartyID[GetBankByPlayerAI(0)]; + *temp = gBattlePartyID[GetBankByIdentity(0)]; for (i = 0; i <= 5; i++) if (i != *temp) temp[pos++] = i; @@ -130,8 +130,8 @@ static void sub_8094998(u8 arg[3], u8 player_number) else { pos = 2; - *temp = gBattlePartyID[GetBankByPlayerAI(0)]; - temp[1] = gBattlePartyID[GetBankByPlayerAI(2)]; + *temp = gBattlePartyID[GetBankByIdentity(0)]; + temp[1] = gBattlePartyID[GetBankByIdentity(2)]; for (i = 0; i <= 5; i++) if ((i != *temp) && (i != temp[1])) temp[pos++] = i; @@ -147,13 +147,13 @@ static void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3) u8 temp[6]; if (!GetBankSide(arg3)) { - i = GetBankByPlayerAI(0); - j = GetBankByPlayerAI(2); + i = GetBankByIdentity(0); + j = GetBankByIdentity(2); } else { - i = GetBankByPlayerAI(1); - j = GetBankByPlayerAI(3); + i = GetBankByIdentity(1); + j = GetBankByIdentity(3); } if (IsLinkDoubleBattle() == TRUE) { diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c index bcaaebcda..6f27469ce 100644 --- a/src/battle/pokeball.c +++ b/src/battle/pokeball.c @@ -383,7 +383,7 @@ static void sub_8046464(u8 taskId) gSprites[spriteId].callback = sub_8047254; break; default: - gBankTarget = GetBankByPlayerAI(1); + gBankTarget = GetBankByIdentity(1); sp0 = TRUE; break; } @@ -722,7 +722,7 @@ static void sub_8046C78(struct Sprite *sprite) r8 = -25; } species = GetMonData(pkmn, MON_DATA_SPECIES); - if ((r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1)) + if ((r5 == GetBankByIdentity(0) || r5 == GetBankByIdentity(1)) && IsDoubleBattle() && ewram17840.unk9_0) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) @@ -737,7 +737,7 @@ static void sub_8046C78(struct Sprite *sprite) } if (!IsDoubleBattle() || !ewram17840.unk9_0) r4_2 = 0; - else if (r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1)) + else if (r5 == GetBankByIdentity(0) || r5 == GetBankByIdentity(1)) r4_2 = 1; else r4_2 = 2; @@ -885,7 +885,7 @@ static void sub_80470C4(struct Sprite *sprite) sprite->data[6] = sprite->oam.affineParam & 0xFF; sprite->data[0] = 0; if (IsDoubleBattle() && ewram17840.unk9_0 - && sprite->data[6] == GetBankByPlayerAI(2)) + && sprite->data[6] == GetBankByIdentity(2)) sprite->callback = sub_8047230; else sprite->callback = sub_8046C78; @@ -910,7 +910,7 @@ static void sub_8047254(struct Sprite *sprite) { sprite->data[0] = 0; if (IsDoubleBattle() && ewram17840.unk9_0 - && sprite->data[6] == GetBankByPlayerAI(3)) + && sprite->data[6] == GetBankByIdentity(3)) sprite->callback = sub_8047230; else sprite->callback = sub_8046C78; diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c index 49b0854cc..a7646e78b 100644 --- a/src/battle/reshow_battle_screen.c +++ b/src/battle/reshow_battle_screen.c @@ -171,13 +171,13 @@ static void CB2_ReshowBattleScreenAfterMenu(void) sub_80327CC(); - opponentBank = GetBankByPlayerAI(1); + opponentBank = GetBankByIdentity(1); species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES); sub_8032984(opponentBank, species); if (IsDoubleBattle()) { - opponentBank = GetBankByPlayerAI(3); + opponentBank = GetBankByIdentity(3); species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES); sub_8032984(opponentBank, species); } diff --git a/src/data/battle_tower/trainers.h b/src/data/battle_tower/trainers.h index b5eb3da7a..ae204f8ea 100644 --- a/src/data/battle_tower/trainers.h +++ b/src/data/battle_tower/trainers.h @@ -1,7 +1,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = { { - .trainerClass = TRAINER_CLASS_YOUNGSTER, + .trainerClass = FACILITY_CLASS_YOUNGSTER, .name = _("ALVIN"), .teamFlags = 0x01, .greeting = { @@ -16,7 +16,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("DIRK"), .teamFlags = 0x01, .greeting = { @@ -31,7 +31,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LADY, + .trainerClass = FACILITY_CLASS_LADY, .name = _("CYBIL"), .teamFlags = 0x02, .greeting = { @@ -46,7 +46,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BLACK_BELT, + .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("CHEN"), .teamFlags = 0x05, .greeting = { @@ -61,7 +61,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_NINJA_BOY, + .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("YOSHI"), .teamFlags = 0x05, .greeting = { @@ -76,7 +76,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, .name = _("TINA"), .teamFlags = 0x0A, .greeting = { @@ -91,7 +91,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("COREY"), .teamFlags = 0x41, .greeting = { @@ -106,7 +106,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_FISHERMAN, + .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("GORDON"), .teamFlags = 0x01, .greeting = { @@ -121,7 +121,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_TUBER_F, + .trainerClass = FACILITY_CLASS_TUBER_F, .name = _("ANN"), .teamFlags = 0x02, .greeting = { @@ -136,7 +136,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_F, + .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("JULIA"), .teamFlags = 0x42, .greeting = { @@ -151,7 +151,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("GREGORY"), .teamFlags = 0x01, .greeting = { @@ -166,7 +166,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CAMPER, + .trainerClass = FACILITY_CLASS_CAMPER, .name = _("KEITH"), .teamFlags = 0x01, .greeting = { @@ -181,7 +181,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, .name = _("KENDRA"), .teamFlags = 0x0A, .greeting = { @@ -196,7 +196,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HIKER, + .trainerClass = FACILITY_CLASS_HIKER, .name = _("DEV"), .teamFlags = 0x01, .greeting = { @@ -211,7 +211,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("CASSIE"), .teamFlags = 0x0A, .greeting = { @@ -226,7 +226,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("JULIAN"), .teamFlags = 0x05, .greeting = { @@ -241,7 +241,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LASS, + .trainerClass = FACILITY_CLASS_LASS, .name = _("JOYCE"), .teamFlags = 0x02, .greeting = { @@ -256,7 +256,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("LES"), .teamFlags = 0x01, .greeting = { @@ -271,7 +271,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RICH_BOY, + .trainerClass = FACILITY_CLASS_RICH_BOY, .name = _("CLINTON"), .teamFlags = 0x01, .greeting = { @@ -286,7 +286,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .trainerClass = FACILITY_CLASS_BUG_CATCHER, .name = _("LEWIS"), .teamFlags = 0x01, .greeting = { @@ -301,7 +301,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PICNICKER, + .trainerClass = FACILITY_CLASS_PICNICKER, .name = _("RACHAEL"), .teamFlags = 0x02, .greeting = { @@ -316,7 +316,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("HAROLD"), .teamFlags = 0x09, .greeting = { @@ -331,7 +331,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_TUBER_M, + .trainerClass = FACILITY_CLASS_TUBER_M, .name = _("KIPP"), .teamFlags = 0x01, .greeting = { @@ -346,7 +346,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = FACILITY_CLASS_KINDLER, .name = _("IRWIN"), .teamFlags = 0x05, .greeting = { @@ -361,7 +361,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("EILEEN"), .teamFlags = 0x0A, .greeting = { @@ -376,7 +376,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_F, + .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("ANNE"), .teamFlags = 0x02, .greeting = { @@ -391,7 +391,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .name = _("RUTH"), .teamFlags = 0x06, .greeting = { @@ -406,7 +406,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMANIAC, + .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("JEREMY"), .teamFlags = 0x40, .greeting = { @@ -421,7 +421,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SAILOR, + .trainerClass = FACILITY_CLASS_SAILOR, .name = _("TREVOR"), .teamFlags = 0x09, .greeting = { @@ -436,7 +436,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, .name = _("COLETTE"), .teamFlags = 0x06, .greeting = { @@ -451,7 +451,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("PAULA"), .teamFlags = 0x42, .greeting = { @@ -466,7 +466,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("STANLY"), .teamFlags = 0x41, .greeting = { @@ -481,7 +481,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("TROY"), .teamFlags = 0x09, .greeting = { @@ -496,7 +496,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_M, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_M, .name = _("ED"), .teamFlags = 0x08, .greeting = { @@ -511,7 +511,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, .name = _("ELLEN"), .teamFlags = 0x04, .greeting = { @@ -526,7 +526,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("ARNIE"), .teamFlags = 0x09, .greeting = { @@ -541,7 +541,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .name = _("HAL"), .teamFlags = 0x09, .greeting = { @@ -556,7 +556,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("LAUREN"), .teamFlags = 0x06, .greeting = { @@ -571,7 +571,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("STACY"), .teamFlags = 0x06, .greeting = { @@ -586,7 +586,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("DARYL"), .teamFlags = 0x81, .greeting = { @@ -601,7 +601,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, .name = _("KATHY"), .teamFlags = 0x04, .greeting = { @@ -616,7 +616,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, .name = _("HARRIS"), .teamFlags = 0x0C, .greeting = { @@ -631,7 +631,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_M, + .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("GLENN"), .teamFlags = 0x80, .greeting = { @@ -646,7 +646,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .name = _("NICO"), .teamFlags = 0x04, .greeting = { @@ -661,7 +661,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, .name = _("BAILEY"), .teamFlags = 0x41, .greeting = { @@ -676,7 +676,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("ABBIE"), .teamFlags = 0x08, .greeting = { @@ -691,7 +691,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CAMPER, + .trainerClass = FACILITY_CLASS_CAMPER, .name = _("AL"), .teamFlags = 0x0C, .greeting = { @@ -706,7 +706,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, .name = _("PEGGY"), .teamFlags = 0x42, .greeting = { @@ -721,7 +721,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("NAOMI"), .teamFlags = 0x04, .greeting = { @@ -736,7 +736,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_NINJA_BOY, + .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("KENJI"), .teamFlags = 0x0C, .greeting = { @@ -751,7 +751,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .name = _("ROSS"), .teamFlags = 0x01, .greeting = { @@ -766,7 +766,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, .name = _("EDNA"), .teamFlags = 0x02, .greeting = { @@ -781,7 +781,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("ANTON"), .teamFlags = 0x41, .greeting = { @@ -796,7 +796,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("MITCH"), .teamFlags = 0x81, .greeting = { @@ -811,7 +811,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("ROD"), .teamFlags = 0x42, .greeting = { @@ -826,7 +826,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .name = _("RICH"), .teamFlags = 0x01, .greeting = { @@ -841,7 +841,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_M, + .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("DANIEL"), .teamFlags = 0x80, .greeting = { @@ -856,7 +856,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("GLORIA"), .teamFlags = 0x82, .greeting = { @@ -871,7 +871,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("NELSON"), .teamFlags = 0x01, .greeting = { @@ -886,7 +886,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = FACILITY_CLASS_KINDLER, .name = _("FERRIS"), .teamFlags = 0x41, .greeting = { @@ -901,7 +901,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("AMANDA"), .teamFlags = 0x82, .greeting = { @@ -916,7 +916,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("MASON"), .teamFlags = 0x10, .greeting = { @@ -931,7 +931,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("NATE"), .teamFlags = 0x10, .greeting = { @@ -946,7 +946,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LASS, + .trainerClass = FACILITY_CLASS_LASS, .name = _("MIRIAM"), .teamFlags = 0x82, .greeting = { @@ -961,7 +961,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMANIAC, + .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("THEO"), .teamFlags = 0x40, .greeting = { @@ -976,7 +976,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, .name = _("PAMELA"), .teamFlags = 0x10, .greeting = { @@ -991,7 +991,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_F, + .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("ALISSA"), .teamFlags = 0x20, .greeting = { @@ -1006,7 +1006,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("ARTHUR"), .teamFlags = 0x20, .greeting = { @@ -1021,7 +1021,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_F, + .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("MARCY"), .teamFlags = 0x82, .greeting = { @@ -1036,7 +1036,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, .name = _("MILLER"), .teamFlags = 0x10, .greeting = { @@ -1051,7 +1051,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("OLIVER"), .teamFlags = 0x11, .greeting = { @@ -1066,7 +1066,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .name = _("MOLLY"), .teamFlags = 0x12, .greeting = { @@ -1081,7 +1081,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("JASON"), .teamFlags = 0x40, .greeting = { @@ -1096,7 +1096,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("AVA"), .teamFlags = 0x20, .greeting = { @@ -1111,7 +1111,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_FISHERMAN, + .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("HANK"), .teamFlags = 0x10, .greeting = { @@ -1126,7 +1126,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SAILOR, + .trainerClass = FACILITY_CLASS_SAILOR, .name = _("PETER"), .teamFlags = 0x20, .greeting = { @@ -1141,7 +1141,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_F, + .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("MINDY"), .teamFlags = 0x20, .greeting = { @@ -1156,7 +1156,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("DWIGHT"), .teamFlags = 0x11, .greeting = { @@ -1171,7 +1171,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, .name = _("REENA"), .teamFlags = 0x12, .greeting = { @@ -1186,7 +1186,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("MEGAN"), .teamFlags = 0x10, .greeting = { @@ -1201,7 +1201,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, .name = _("SIERRA"), .teamFlags = 0x04, .greeting = { @@ -1216,7 +1216,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, .name = _("ARNOLD"), .teamFlags = 0x08, .greeting = { @@ -1231,7 +1231,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BLACK_BELT, + .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("XIN"), .teamFlags = 0x04, .greeting = { @@ -1246,7 +1246,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, .name = _("KELLY"), .teamFlags = 0x02, .greeting = { @@ -1261,7 +1261,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("VANCE"), .teamFlags = 0x80, .greeting = { @@ -1276,7 +1276,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("TOBY"), .teamFlags = 0x01, .greeting = { @@ -1291,7 +1291,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("NORTON"), .teamFlags = 0x20, .greeting = { @@ -1306,7 +1306,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("ZOE"), .teamFlags = 0x02, .greeting = { @@ -1321,7 +1321,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("EMMA"), .teamFlags = 0x20, .greeting = { @@ -1336,7 +1336,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HIKER, + .trainerClass = FACILITY_CLASS_HIKER, .name = _("VINCE"), .teamFlags = 0x04, .greeting = { @@ -1351,7 +1351,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_M, + .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("MARV"), .teamFlags = 0x10, .greeting = { @@ -1366,7 +1366,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, .name = _("TODD"), .teamFlags = 0x40, .greeting = { @@ -1381,7 +1381,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("GAVIN"), .teamFlags = 0x01, .greeting = { @@ -1396,7 +1396,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("QUINN"), .teamFlags = 0x08, .greeting = { @@ -1411,7 +1411,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, .name = _("JENN"), .teamFlags = 0x02, .greeting = { @@ -1426,7 +1426,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_M, + .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("JOEL"), .teamFlags = 0x10, .greeting = { @@ -1441,7 +1441,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("KYLE"), .teamFlags = 0x0C, .greeting = { @@ -1456,7 +1456,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, .name = _("BRET"), .teamFlags = 0x01, .greeting = { @@ -1471,7 +1471,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_F, + .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("CARRIE"), .teamFlags = 0x10, .greeting = { @@ -1486,7 +1486,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LADY, + .trainerClass = FACILITY_CLASS_LADY, .name = _("GILLIAN"), .teamFlags = 0x02, .greeting = { diff --git a/src/data/battle_tower/trainers_de.h b/src/data/battle_tower/trainers_de.h index 86182da9d..db226c6a6 100644 --- a/src/data/battle_tower/trainers_de.h +++ b/src/data/battle_tower/trainers_de.h @@ -1,7 +1,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = { { - .trainerClass = TRAINER_CLASS_YOUNGSTER, + .trainerClass = FACILITY_CLASS_YOUNGSTER, .name = _("ALWIN"), .teamFlags = 0x01, .greeting = { @@ -16,7 +16,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("DIRK"), .teamFlags = 0x01, .greeting = { @@ -31,7 +31,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LADY, + .trainerClass = FACILITY_CLASS_LADY, .name = _("SIBILLE"), .teamFlags = 0x02, .greeting = { @@ -46,7 +46,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BLACK_BELT, + .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("OLAF"), .teamFlags = 0x05, .greeting = { @@ -61,7 +61,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_NINJA_BOY, + .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("JOST"), .teamFlags = 0x05, .greeting = { @@ -76,7 +76,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, .name = _("TINA"), .teamFlags = 0x0A, .greeting = { @@ -91,7 +91,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("HAJO"), .teamFlags = 0x41, .greeting = { @@ -106,7 +106,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_FISHERMAN, + .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("GEORG"), .teamFlags = 0x01, .greeting = { @@ -121,7 +121,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_TUBER_F, + .trainerClass = FACILITY_CLASS_TUBER_F, .name = _("ANNE"), .teamFlags = 0x02, .greeting = { @@ -136,7 +136,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_F, + .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("JULIA"), .teamFlags = 0x42, .greeting = { @@ -151,7 +151,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("JOHANN"), .teamFlags = 0x01, .greeting = { @@ -166,7 +166,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CAMPER, + .trainerClass = FACILITY_CLASS_CAMPER, .name = _("KARL"), .teamFlags = 0x01, .greeting = { @@ -181,7 +181,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, .name = _("KENDRA"), .teamFlags = 0x0A, .greeting = { @@ -196,7 +196,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HIKER, + .trainerClass = FACILITY_CLASS_HIKER, .name = _("DAVID"), .teamFlags = 0x01, .greeting = { @@ -211,7 +211,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("KEA"), .teamFlags = 0x0A, .greeting = { @@ -226,7 +226,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("JULIAN"), .teamFlags = 0x05, .greeting = { @@ -241,7 +241,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LASS, + .trainerClass = FACILITY_CLASS_LASS, .name = _("JOSI"), .teamFlags = 0x02, .greeting = { @@ -256,7 +256,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("LEIF"), .teamFlags = 0x01, .greeting = { @@ -271,7 +271,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RICH_BOY, + .trainerClass = FACILITY_CLASS_RICH_BOY, .name = _("INGO"), .teamFlags = 0x01, .greeting = { @@ -286,7 +286,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .trainerClass = FACILITY_CLASS_BUG_CATCHER, .name = _("LUDWIG"), .teamFlags = 0x01, .greeting = { @@ -301,7 +301,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PICNICKER, + .trainerClass = FACILITY_CLASS_PICNICKER, .name = _("RAJA"), .teamFlags = 0x02, .greeting = { @@ -316,7 +316,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("HARALD"), .teamFlags = 0x09, .greeting = { @@ -331,7 +331,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_TUBER_M, + .trainerClass = FACILITY_CLASS_TUBER_M, .name = _("KIM"), .teamFlags = 0x01, .greeting = { @@ -346,7 +346,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = FACILITY_CLASS_KINDLER, .name = _("ERWIN"), .teamFlags = 0x05, .greeting = { @@ -361,7 +361,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("EIKA"), .teamFlags = 0x0A, .greeting = { @@ -376,7 +376,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_F, + .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("ANNINA"), .teamFlags = 0x02, .greeting = { @@ -391,7 +391,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .name = _("RUTH"), .teamFlags = 0x06, .greeting = { @@ -406,7 +406,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMANIAC, + .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("JENS"), .teamFlags = 0x40, .greeting = { @@ -421,7 +421,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SAILOR, + .trainerClass = FACILITY_CLASS_SAILOR, .name = _("TITUS"), .teamFlags = 0x09, .greeting = { @@ -436,7 +436,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, .name = _("NICOLA"), .teamFlags = 0x06, .greeting = { @@ -451,7 +451,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("PAULA"), .teamFlags = 0x42, .greeting = { @@ -466,7 +466,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("SÖREN"), .teamFlags = 0x41, .greeting = { @@ -481,7 +481,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("RAINER"), .teamFlags = 0x09, .greeting = { @@ -496,7 +496,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_M, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_M, .name = _("FABIAN"), .teamFlags = 0x08, .greeting = { @@ -511,7 +511,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, .name = _("ELLEN"), .teamFlags = 0x04, .greeting = { @@ -526,7 +526,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("ARNIE"), .teamFlags = 0x09, .greeting = { @@ -541,7 +541,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .name = _("HARDI"), .teamFlags = 0x09, .greeting = { @@ -556,7 +556,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("LINA"), .teamFlags = 0x06, .greeting = { @@ -571,7 +571,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("SELINA"), .teamFlags = 0x06, .greeting = { @@ -586,7 +586,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("DANTE"), .teamFlags = 0x81, .greeting = { @@ -601,7 +601,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, .name = _("KATJA"), .teamFlags = 0x04, .greeting = { @@ -616,7 +616,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, .name = _("HORST"), .teamFlags = 0x0C, .greeting = { @@ -631,7 +631,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_M, + .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("GERRIT"), .teamFlags = 0x80, .greeting = { @@ -646,7 +646,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .name = _("NIKO"), .teamFlags = 0x04, .greeting = { @@ -661,7 +661,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, .name = _("BALDO"), .teamFlags = 0x41, .greeting = { @@ -676,7 +676,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("ALMA"), .teamFlags = 0x08, .greeting = { @@ -691,7 +691,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CAMPER, + .trainerClass = FACILITY_CLASS_CAMPER, .name = _("ADAM"), .teamFlags = 0x0C, .greeting = { @@ -706,7 +706,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, .name = _("GRETE"), .teamFlags = 0x42, .greeting = { @@ -721,7 +721,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("NAOMI"), .teamFlags = 0x04, .greeting = { @@ -736,7 +736,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_NINJA_BOY, + .trainerClass = FACILITY_CLASS_NINJA_BOY, .name = _("KENO"), .teamFlags = 0x0C, .greeting = { @@ -751,7 +751,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .name = _("REMUS"), .teamFlags = 0x01, .greeting = { @@ -766,7 +766,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, .name = _("EDITH"), .teamFlags = 0x02, .greeting = { @@ -781,7 +781,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, .name = _("ANTON"), .teamFlags = 0x41, .greeting = { @@ -796,7 +796,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = FACILITY_CLASS_SWIMMER_M, .name = _("MALTE"), .teamFlags = 0x81, .greeting = { @@ -811,7 +811,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = FACILITY_CLASS_HEX_MANIAC, .name = _("RAOUL"), .teamFlags = 0x42, .greeting = { @@ -826,7 +826,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .name = _("RICK"), .teamFlags = 0x01, .greeting = { @@ -841,7 +841,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_M, + .trainerClass = FACILITY_CLASS_POKEFAN_M, .name = _("DENNIS"), .teamFlags = 0x80, .greeting = { @@ -856,7 +856,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .trainerClass = FACILITY_CLASS_PSYCHIC_F, .name = _("GLORIA"), .teamFlags = 0x82, .greeting = { @@ -871,7 +871,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("NINO"), .teamFlags = 0x01, .greeting = { @@ -886,7 +886,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = FACILITY_CLASS_KINDLER, .name = _("FIETE"), .teamFlags = 0x41, .greeting = { @@ -901,7 +901,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .trainerClass = FACILITY_CLASS_AROMA_LADY, .name = _("AMANDA"), .teamFlags = 0x82, .greeting = { @@ -916,7 +916,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("MAREK"), .teamFlags = 0x10, .greeting = { @@ -931,7 +931,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("NATHAN"), .teamFlags = 0x10, .greeting = { @@ -946,7 +946,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LASS, + .trainerClass = FACILITY_CLASS_LASS, .name = _("MIRIAM"), .teamFlags = 0x82, .greeting = { @@ -961,7 +961,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMANIAC, + .trainerClass = FACILITY_CLASS_POKEMANIAC, .name = _("THEO"), .teamFlags = 0x40, .greeting = { @@ -976,7 +976,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, .name = _("PIA"), .teamFlags = 0x10, .greeting = { @@ -991,7 +991,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEFAN_F, + .trainerClass = FACILITY_CLASS_POKEFAN_F, .name = _("ALISSA"), .teamFlags = 0x20, .greeting = { @@ -1006,7 +1006,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("ARTUR"), .teamFlags = 0x20, .greeting = { @@ -1021,7 +1021,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMER_F, + .trainerClass = FACILITY_CLASS_SWIMMER_F, .name = _("MAJA"), .teamFlags = 0x82, .greeting = { @@ -1036,7 +1036,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, .name = _("MARIUS"), .teamFlags = 0x10, .greeting = { @@ -1051,7 +1051,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, .name = _("OLIVER"), .teamFlags = 0x11, .greeting = { @@ -1066,7 +1066,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .name = _("MOLLY"), .teamFlags = 0x12, .greeting = { @@ -1081,7 +1081,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("JÖRG"), .teamFlags = 0x40, .greeting = { @@ -1096,7 +1096,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("ANKE"), .teamFlags = 0x20, .greeting = { @@ -1111,7 +1111,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_FISHERMAN, + .trainerClass = FACILITY_CLASS_FISHERMAN, .name = _("HANS"), .teamFlags = 0x10, .greeting = { @@ -1126,7 +1126,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SAILOR, + .trainerClass = FACILITY_CLASS_SAILOR, .name = _("PETER"), .teamFlags = 0x20, .greeting = { @@ -1141,7 +1141,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_F, + .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("MARA"), .teamFlags = 0x20, .greeting = { @@ -1156,7 +1156,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .trainerClass = FACILITY_CLASS_BUG_MANIAC, .name = _("DARIUS"), .teamFlags = 0x11, .greeting = { @@ -1171,7 +1171,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, .name = _("REGINA"), .teamFlags = 0x12, .greeting = { @@ -1186,7 +1186,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .trainerClass = FACILITY_CLASS_PARASOL_LADY, .name = _("MAIKE"), .teamFlags = 0x10, .greeting = { @@ -1201,7 +1201,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, .name = _("SANDRA"), .teamFlags = 0x04, .greeting = { @@ -1216,7 +1216,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, .name = _("ARNOLD"), .teamFlags = 0x08, .greeting = { @@ -1231,7 +1231,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BLACK_BELT, + .trainerClass = FACILITY_CLASS_BLACK_BELT, .name = _("XENO"), .teamFlags = 0x04, .greeting = { @@ -1246,7 +1246,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, .name = _("KARLA"), .teamFlags = 0x02, .greeting = { @@ -1261,7 +1261,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = FACILITY_CLASS_COLLECTOR, .name = _("VOLKER"), .teamFlags = 0x80, .greeting = { @@ -1276,7 +1276,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .name = _("TOBIAS"), .teamFlags = 0x01, .greeting = { @@ -1291,7 +1291,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = FACILITY_CLASS_GENTLEMAN, .name = _("NORBERT"), .teamFlags = 0x20, .greeting = { @@ -1306,7 +1306,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, .name = _("ZITA"), .teamFlags = 0x02, .greeting = { @@ -1321,7 +1321,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_BEAUTY, + .trainerClass = FACILITY_CLASS_BEAUTY, .name = _("ELKE"), .teamFlags = 0x20, .greeting = { @@ -1336,7 +1336,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_HIKER, + .trainerClass = FACILITY_CLASS_HIKER, .name = _("VITUS"), .teamFlags = 0x04, .greeting = { @@ -1351,7 +1351,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_M, + .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("MALTE"), .teamFlags = 0x10, .greeting = { @@ -1366,7 +1366,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, .name = _("TIM"), .teamFlags = 0x40, .greeting = { @@ -1381,7 +1381,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = FACILITY_CLASS_GUITARIST, .name = _("GAVIN"), .teamFlags = 0x01, .greeting = { @@ -1396,7 +1396,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .trainerClass = FACILITY_CLASS_PSYCHIC_M, .name = _("RALF"), .teamFlags = 0x08, .greeting = { @@ -1411,7 +1411,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, .name = _("JENNY"), .teamFlags = 0x02, .greeting = { @@ -1426,7 +1426,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_M, + .trainerClass = FACILITY_CLASS_EXPERT_M, .name = _("JOEL"), .teamFlags = 0x10, .greeting = { @@ -1441,7 +1441,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, .name = _("KOLJA"), .teamFlags = 0x0C, .greeting = { @@ -1456,7 +1456,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, .name = _("BILL"), .teamFlags = 0x01, .greeting = { @@ -1471,7 +1471,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_EXPERT_F, + .trainerClass = FACILITY_CLASS_EXPERT_F, .name = _("CALLA"), .teamFlags = 0x10, .greeting = { @@ -1486,7 +1486,7 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = }, }, { - .trainerClass = TRAINER_CLASS_LADY, + .trainerClass = FACILITY_CLASS_LADY, .name = _("GESA"), .teamFlags = 0x02, .greeting = { diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h index c86e795c4..d03038674 100644 --- a/src/data/pokemon/trainer_class_lookups.h +++ b/src/data/pokemon/trainer_class_lookups.h @@ -2,8 +2,8 @@ // -#ifndef POKERUBY_TRAINER_CLASS_LOOKUPS_H -#define POKERUBY_TRAINER_CLASS_LOOKUPS_H +#ifndef POKERUBY_FACILITY_CLASS_LOOKUPS_H +#define POKERUBY_FACILITY_CLASS_LOOKUPS_H const u8 gTrainerClassToPicIndex[] = { TRAINER_PIC_ARCHIE, // AQUA_LEADER @@ -86,83 +86,83 @@ const u8 gTrainerClassToPicIndex[] = { }; const u8 gTrainerClassToNameIndex[] = { - TRAINER_CLASS_NAME_AQUA_LEADER, // AQUA_LEADER - TRAINER_CLASS_NAME_TEAM_AQUA, // TEAM_AQUA_M - TRAINER_CLASS_NAME_TEAM_AQUA, // TEAM_AQUA_F - TRAINER_CLASS_NAME_AROMA_LADY, // AROMA_LADY - TRAINER_CLASS_NAME_RUIN_MANIAC, // RUIN_MANIAC - TRAINER_CLASS_NAME_INTERVIEWER, // INTERVIEWER - TRAINER_CLASS_NAME_TUBER_F, // TUBER_F - TRAINER_CLASS_NAME_TUBER_M, // TUBER_M - TRAINER_CLASS_NAME_COOL_TRAINER, // COOL_TRAINER_M - TRAINER_CLASS_NAME_COOL_TRAINER, // COOL_TRAINER_F - TRAINER_CLASS_NAME_HEX_MANIAC, // HEX_MANIAC - TRAINER_CLASS_NAME_LADY, // LADY - TRAINER_CLASS_NAME_BEAUTY, // BEAUTY - TRAINER_CLASS_NAME_RICH_BOY, // RICH_BOY - TRAINER_CLASS_NAME_POKEMANIAC, // POKEMANIAC - TRAINER_CLASS_NAME_SWIMMER_M, // SWIMMER_M - TRAINER_CLASS_NAME_BLACK_BELT, // BLACK_BELT - TRAINER_CLASS_NAME_GUITARIST, // GUITARIST - TRAINER_CLASS_NAME_KINDLER, // KINDLER - TRAINER_CLASS_NAME_CAMPER, // CAMPER - TRAINER_CLASS_NAME_BUG_MANIAC, // BUG_MANIAC - TRAINER_CLASS_NAME_PSYCHIC, // PSYCHIC_M - TRAINER_CLASS_NAME_PSYCHIC, // PSYCHIC_F - TRAINER_CLASS_NAME_GENTLEMAN, // GENTLEMAN - TRAINER_CLASS_NAME_ELITE_FOUR, // ELITE_FOUR_M - TRAINER_CLASS_NAME_ELITE_FOUR, // ELITE_FOUR_F - TRAINER_CLASS_NAME_LEADER, // LEADER_F - TRAINER_CLASS_NAME_LEADER, // LEADER_M - TRAINER_CLASS_NAME_LEADER, // LEADER_MF - TRAINER_CLASS_NAME_SCHOOL_KID, // SCHOOL_KID_M - TRAINER_CLASS_NAME_SCHOOL_KID, // SCHOOL_KID_F - TRAINER_CLASS_NAME_SR_AND_JR, // SR_AND_JR - TRAINER_CLASS_NAME_POKEFAN, // POKEFAN_M - TRAINER_CLASS_NAME_POKEFAN, // POKEFAN_F - TRAINER_CLASS_NAME_EXPERT, // EXPERT_M - TRAINER_CLASS_NAME_EXPERT, // EXPERT_F - TRAINER_CLASS_NAME_YOUNGSTER, // YOUNGSTER - TRAINER_CLASS_NAME_CHAMPION, // CHAMPION - TRAINER_CLASS_NAME_FISHERMAN, // FISHERMAN - TRAINER_CLASS_NAME_TRIATHLETE, // CYCLING_TRIATHLETE_M - TRAINER_CLASS_NAME_TRIATHLETE, // CYCLING_TRIATHLETE_F - TRAINER_CLASS_NAME_TRIATHLETE, // RUNNING_TRIATHLETE_M - TRAINER_CLASS_NAME_TRIATHLETE, // RUNNING_TRIATHLETE_F - TRAINER_CLASS_NAME_TRIATHLETE, // SWIMMING_TRIATHLETE_M - TRAINER_CLASS_NAME_TRIATHLETE, // SWIMMING_TRIATHLETE_F - TRAINER_CLASS_NAME_DRAGON_TAMER, // DRAGON_TAMER - TRAINER_CLASS_NAME_BIRD_KEEPER, // BIRD_KEEPER - TRAINER_CLASS_NAME_NINJA_BOY, // NINJA_BOY - TRAINER_CLASS_NAME_BATTLE_GIRL, // BATTLE_GIRL - TRAINER_CLASS_NAME_PARASOL_LADY, // PARASOL_LADY - TRAINER_CLASS_NAME_SWIMMER_F, // SWIMMER_F - TRAINER_CLASS_NAME_PICNICKER, // PICNICKER - TRAINER_CLASS_NAME_TWINS, // TWINS - TRAINER_CLASS_NAME_SAILOR, // SAILOR - TRAINER_CLASS_NAME_BOARDER, // BOARDER_1 - TRAINER_CLASS_NAME_BOARDER, // BOARDER_2 - TRAINER_CLASS_NAME_COLLECTOR, // COLLECTOR - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // WALLY - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_1 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_2 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_3 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_1 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_2 - TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_3 - TRAINER_CLASS_NAME_POKEMON_BREEDER, // POKEMON_BREEDER_M - TRAINER_CLASS_NAME_POKEMON_BREEDER, // POKEMON_BREEDER_F - TRAINER_CLASS_NAME_POKEMON_RANGER, // POKEMON_RANGER_M - TRAINER_CLASS_NAME_POKEMON_RANGER, // POKEMON_RANGER_F - TRAINER_CLASS_NAME_MAGMA_LEADER, // MAGMA_LEADER - TRAINER_CLASS_NAME_TEAM_MAGMA, // TEAM_MAGMA_M - TRAINER_CLASS_NAME_TEAM_MAGMA, // TEAM_MAGMA_F - TRAINER_CLASS_NAME_LASS, // LASS - TRAINER_CLASS_NAME_BUG_CATCHER, // BUG_CATCHER - TRAINER_CLASS_NAME_HIKER, // HIKER - TRAINER_CLASS_NAME_YOUNG_COUPLE, // YOUNG_COUPLE - TRAINER_CLASS_NAME_OLD_COUPLE, // OLD_COUPLE - TRAINER_CLASS_NAME_SIS_AND_BRO // SIS_AND_BRO + TRAINER_CLASS_AQUA_LEADER, // AQUA_LEADER + TRAINER_CLASS_TEAM_AQUA, // TEAM_AQUA_M + TRAINER_CLASS_TEAM_AQUA, // TEAM_AQUA_F + TRAINER_CLASS_AROMA_LADY, // AROMA_LADY + TRAINER_CLASS_RUIN_MANIAC, // RUIN_MANIAC + TRAINER_CLASS_INTERVIEWER, // INTERVIEWER + TRAINER_CLASS_TUBER_F, // TUBER_F + TRAINER_CLASS_TUBER_M, // TUBER_M + TRAINER_CLASS_COOL_TRAINER, // COOL_TRAINER_M + TRAINER_CLASS_COOL_TRAINER, // COOL_TRAINER_F + TRAINER_CLASS_HEX_MANIAC, // HEX_MANIAC + TRAINER_CLASS_LADY, // LADY + TRAINER_CLASS_BEAUTY, // BEAUTY + TRAINER_CLASS_RICH_BOY, // RICH_BOY + TRAINER_CLASS_POKEMANIAC, // POKEMANIAC + TRAINER_CLASS_SWIMMER_M, // SWIMMER_M + TRAINER_CLASS_BLACK_BELT, // BLACK_BELT + TRAINER_CLASS_GUITARIST, // GUITARIST + TRAINER_CLASS_KINDLER, // KINDLER + TRAINER_CLASS_CAMPER, // CAMPER + TRAINER_CLASS_BUG_MANIAC, // BUG_MANIAC + TRAINER_CLASS_PSYCHIC, // PSYCHIC_M + TRAINER_CLASS_PSYCHIC, // PSYCHIC_F + TRAINER_CLASS_GENTLEMAN, // GENTLEMAN + TRAINER_CLASS_ELITE_FOUR, // ELITE_FOUR_M + TRAINER_CLASS_ELITE_FOUR, // ELITE_FOUR_F + TRAINER_CLASS_LEADER, // LEADER_F + TRAINER_CLASS_LEADER, // LEADER_M + TRAINER_CLASS_LEADER, // LEADER_MF + TRAINER_CLASS_SCHOOL_KID, // SCHOOL_KID_M + TRAINER_CLASS_SCHOOL_KID, // SCHOOL_KID_F + TRAINER_CLASS_SR_AND_JR, // SR_AND_JR + TRAINER_CLASS_POKEFAN, // POKEFAN_M + TRAINER_CLASS_POKEFAN, // POKEFAN_F + TRAINER_CLASS_EXPERT, // EXPERT_M + TRAINER_CLASS_EXPERT, // EXPERT_F + TRAINER_CLASS_YOUNGSTER, // YOUNGSTER + TRAINER_CLASS_CHAMPION, // CHAMPION + TRAINER_CLASS_FISHERMAN, // FISHERMAN + TRAINER_CLASS_TRIATHLETE, // CYCLING_TRIATHLETE_M + TRAINER_CLASS_TRIATHLETE, // CYCLING_TRIATHLETE_F + TRAINER_CLASS_TRIATHLETE, // RUNNING_TRIATHLETE_M + TRAINER_CLASS_TRIATHLETE, // RUNNING_TRIATHLETE_F + TRAINER_CLASS_TRIATHLETE, // SWIMMING_TRIATHLETE_M + TRAINER_CLASS_TRIATHLETE, // SWIMMING_TRIATHLETE_F + TRAINER_CLASS_DRAGON_TAMER, // DRAGON_TAMER + TRAINER_CLASS_BIRD_KEEPER, // BIRD_KEEPER + TRAINER_CLASS_NINJA_BOY, // NINJA_BOY + TRAINER_CLASS_BATTLE_GIRL, // BATTLE_GIRL + TRAINER_CLASS_PARASOL_LADY, // PARASOL_LADY + TRAINER_CLASS_SWIMMER_F, // SWIMMER_F + TRAINER_CLASS_PICNICKER, // PICNICKER + TRAINER_CLASS_TWINS, // TWINS + TRAINER_CLASS_SAILOR, // SAILOR + TRAINER_CLASS_BOARDER, // BOARDER_1 + TRAINER_CLASS_BOARDER, // BOARDER_2 + TRAINER_CLASS_COLLECTOR, // COLLECTOR + TRAINER_CLASS_POKEMON_TRAINER_3, // WALLY + TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_1 + TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_2 + TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_3 + TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_1 + TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_2 + TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_3 + TRAINER_CLASS_POKEMON_BREEDER, // POKEMON_BREEDER_M + TRAINER_CLASS_POKEMON_BREEDER, // POKEMON_BREEDER_F + TRAINER_CLASS_POKEMON_RANGER, // POKEMON_RANGER_M + TRAINER_CLASS_POKEMON_RANGER, // POKEMON_RANGER_F + TRAINER_CLASS_MAGMA_LEADER, // MAGMA_LEADER + TRAINER_CLASS_TEAM_MAGMA, // TEAM_MAGMA_M + TRAINER_CLASS_TEAM_MAGMA, // TEAM_MAGMA_F + TRAINER_CLASS_LASS, // LASS + TRAINER_CLASS_BUG_CATCHER, // BUG_CATCHER + TRAINER_CLASS_HIKER, // HIKER + TRAINER_CLASS_YOUNG_COUPLE, // YOUNG_COUPLE + TRAINER_CLASS_OLD_COUPLE, // OLD_COUPLE + TRAINER_CLASS_SIS_AND_BRO // SIS_AND_BRO }; -#endif //POKERUBY_TRAINER_CLASS_LOOKUPS_H +#endif //POKERUBY_FACILITY_CLASS_LOOKUPS_H diff --git a/src/de_rom_8040FE0.c b/src/de_rom_8040FE0.c index ad1cbf473..c93ef74cd 100644 --- a/src/de_rom_8040FE0.c +++ b/src/de_rom_8040FE0.c @@ -13,7 +13,7 @@ u8 *de_sub_8040FE0(u8 gender) { if (gender) gender++; - gender = TRAINER_CLASS_NAME_SCHOOL_KID; + gender = TRAINER_CLASS_SCHOOL_KID; return gTrainerClassNames[gender]; } @@ -21,7 +21,7 @@ u8 *de_sub_8040FF4(u8 gender) { if (gender) gender++; - gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3; + gender = TRAINER_CLASS_POKEMON_TRAINER_3; return gTrainerClassNames[gender]; } @@ -29,7 +29,7 @@ u8 *de_sub_804100C(u8 gender) { if (gender) gender++; - gender = TRAINER_CLASS_NAME_LEADER; + gender = TRAINER_CLASS_LEADER; return gTrainerClassNames[gender]; } @@ -50,34 +50,34 @@ u8 *de_sub_8041024(s32 arg0, u32 arg1) case 0x400: nameIndex = GetSecretBaseTrainerNameIndex(); gender = eSecretBaseRecord.gender; - if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID) + if (nameIndex == TRAINER_CLASS_SCHOOL_KID) return de_sub_8040FE0(gender); return gTrainerClassNames[nameIndex]; case 0x100: trainerClass = de_sub_81364AC(); nameIndex = get_trainer_class_name_index(); - if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + if (trainerClass == FACILITY_CLASS_SCHOOL_KID_F) return de_sub_8040FE0(FEMALE); - if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + if (trainerClass == FACILITY_CLASS_MAY_1 || trainerClass == FACILITY_CLASS_MAY_2 || trainerClass == FACILITY_CLASS_MAY_3) return de_sub_8040FF4(FEMALE); return gTrainerClassNames[nameIndex]; case 0x800: trainerClass = de_sub_81364F8(); nameIndex = GetEReaderTrainerClassNameIndex(); - if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + if (trainerClass == FACILITY_CLASS_SCHOOL_KID_F) return de_sub_8040FE0(FEMALE); - if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + if (trainerClass == FACILITY_CLASS_MAY_1 || trainerClass == FACILITY_CLASS_MAY_2 || trainerClass == FACILITY_CLASS_MAY_3) return de_sub_8040FF4(FEMALE); return gTrainerClassNames[nameIndex]; default: trainer = &gTrainers[arg1]; trainerClass = trainer->trainerClass; local2 = sub_803FC58(arg1); - if (trainerClass == TRAINER_CLASS_LEADER_F) + if (trainerClass == FACILITY_CLASS_LEADER_F) return de_sub_8040FE0(local2); - if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE) + if (trainerClass == FACILITY_CLASS_BIRD_KEEPER && local2 == FEMALE) return de_sub_8040FF4(FEMALE); - if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F) + if (trainerClass == FACILITY_CLASS_ELITE_FOUR_F) { if (gTrainers[arg1].doubleBattle == TRUE) return de_sub_804100C(FEMALE); diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c index 88115d28a..11c05e478 100644 --- a/src/field/battle_tower.c +++ b/src/field/battle_tower.c @@ -103,59 +103,59 @@ static const u16 sBattleTowerHeldItems[] = { #include "../data/battle_tower/level_100_mons.h" static const u8 sMaleTrainerClasses[] = { - TRAINER_CLASS_RUIN_MANIAC, - TRAINER_CLASS_TUBER_M, - TRAINER_CLASS_COOL_TRAINER_M, - TRAINER_CLASS_RICH_BOY, - TRAINER_CLASS_POKEMANIAC, - TRAINER_CLASS_SWIMMER_M, - TRAINER_CLASS_BLACK_BELT, - TRAINER_CLASS_GUITARIST, - TRAINER_CLASS_KINDLER, - TRAINER_CLASS_CAMPER, - TRAINER_CLASS_BUG_MANIAC, - TRAINER_CLASS_PSYCHIC_M, - TRAINER_CLASS_GENTLEMAN, - TRAINER_CLASS_SCHOOL_KID_M, - TRAINER_CLASS_POKEFAN_M, - TRAINER_CLASS_EXPERT_M, - TRAINER_CLASS_YOUNGSTER, - TRAINER_CLASS_FISHERMAN, - TRAINER_CLASS_CYCLING_TRIATHLETE_M, - TRAINER_CLASS_RUNNING_TRIATHLETE_M, - TRAINER_CLASS_SWIMMING_TRIATHLETE_M, - TRAINER_CLASS_DRAGON_TAMER, - TRAINER_CLASS_BIRD_KEEPER, - TRAINER_CLASS_NINJA_BOY, - TRAINER_CLASS_SAILOR, - TRAINER_CLASS_COLLECTOR, - TRAINER_CLASS_POKEMON_BREEDER_M, - TRAINER_CLASS_POKEMON_RANGER_M, - TRAINER_CLASS_BUG_CATCHER, - TRAINER_CLASS_HIKER, + FACILITY_CLASS_RUIN_MANIAC, + FACILITY_CLASS_TUBER_M, + FACILITY_CLASS_COOL_TRAINER_M, + FACILITY_CLASS_RICH_BOY, + FACILITY_CLASS_POKEMANIAC, + FACILITY_CLASS_SWIMMER_M, + FACILITY_CLASS_BLACK_BELT, + FACILITY_CLASS_GUITARIST, + FACILITY_CLASS_KINDLER, + FACILITY_CLASS_CAMPER, + FACILITY_CLASS_BUG_MANIAC, + FACILITY_CLASS_PSYCHIC_M, + FACILITY_CLASS_GENTLEMAN, + FACILITY_CLASS_SCHOOL_KID_M, + FACILITY_CLASS_POKEFAN_M, + FACILITY_CLASS_EXPERT_M, + FACILITY_CLASS_YOUNGSTER, + FACILITY_CLASS_FISHERMAN, + FACILITY_CLASS_CYCLING_TRIATHLETE_M, + FACILITY_CLASS_RUNNING_TRIATHLETE_M, + FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + FACILITY_CLASS_DRAGON_TAMER, + FACILITY_CLASS_BIRD_KEEPER, + FACILITY_CLASS_NINJA_BOY, + FACILITY_CLASS_SAILOR, + FACILITY_CLASS_COLLECTOR, + FACILITY_CLASS_POKEMON_BREEDER_M, + FACILITY_CLASS_POKEMON_RANGER_M, + FACILITY_CLASS_BUG_CATCHER, + FACILITY_CLASS_HIKER, }; static const u8 sFemaleTrainerClasses[] = { - TRAINER_CLASS_AROMA_LADY, - TRAINER_CLASS_TUBER_F, - TRAINER_CLASS_COOL_TRAINER_F, - TRAINER_CLASS_HEX_MANIAC, - TRAINER_CLASS_LADY, - TRAINER_CLASS_BEAUTY, - TRAINER_CLASS_PSYCHIC_F, - TRAINER_CLASS_SCHOOL_KID_F, - TRAINER_CLASS_POKEFAN_F, - TRAINER_CLASS_EXPERT_F, - TRAINER_CLASS_CYCLING_TRIATHLETE_F, - TRAINER_CLASS_RUNNING_TRIATHLETE_F, - TRAINER_CLASS_SWIMMING_TRIATHLETE_F, - TRAINER_CLASS_BATTLE_GIRL, - TRAINER_CLASS_PARASOL_LADY, - TRAINER_CLASS_SWIMMER_F, - TRAINER_CLASS_PICNICKER, - TRAINER_CLASS_POKEMON_BREEDER_F, - TRAINER_CLASS_POKEMON_RANGER_F, - TRAINER_CLASS_LASS, + FACILITY_CLASS_AROMA_LADY, + FACILITY_CLASS_TUBER_F, + FACILITY_CLASS_COOL_TRAINER_F, + FACILITY_CLASS_HEX_MANIAC, + FACILITY_CLASS_LADY, + FACILITY_CLASS_BEAUTY, + FACILITY_CLASS_PSYCHIC_F, + FACILITY_CLASS_SCHOOL_KID_F, + FACILITY_CLASS_POKEFAN_F, + FACILITY_CLASS_EXPERT_F, + FACILITY_CLASS_CYCLING_TRIATHLETE_F, + FACILITY_CLASS_RUNNING_TRIATHLETE_F, + FACILITY_CLASS_SWIMMING_TRIATHLETE_F, + FACILITY_CLASS_BATTLE_GIRL, + FACILITY_CLASS_PARASOL_LADY, + FACILITY_CLASS_SWIMMER_F, + FACILITY_CLASS_PICNICKER, + FACILITY_CLASS_POKEMON_BREEDER_F, + FACILITY_CLASS_POKEMON_RANGER_F, + FACILITY_CLASS_LASS, }; static const u8 sMaleTrainerGfxIds[] = { diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c index 37bc2e0ad..1b00ad96e 100644 --- a/src/pokemon/pokemon_2.c +++ b/src/pokemon/pokemon_2.c @@ -84,7 +84,7 @@ u8 sub_803C434(u8 a1) status ^= 1; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - return GetBankByPlayerAI(status); + return GetBankByIdentity(status); if (CountAliveMons(0) > 1) { u8 val; @@ -93,14 +93,14 @@ u8 sub_803C434(u8 a1) val = status ^ 2; else val = status; - return GetBankByPlayerAI(val); + return GetBankByIdentity(val); } else { if ((gAbsentBankFlags & gBitTable[status])) - return GetBankByPlayerAI(status ^ 2); + return GetBankByIdentity(status ^ 2); else - return GetBankByPlayerAI(status); + return GetBankByIdentity(status); } } diff --git a/src/pokemon/pokemon_data.c b/src/pokemon/pokemon_data.c index 82e452158..031f2ea24 100644 --- a/src/pokemon/pokemon_data.c +++ b/src/pokemon/pokemon_data.c @@ -84,9 +84,9 @@ const struct SpriteTemplate gSpriteTemplate_8208288[] = { const u8 gSecretBaseTrainerClasses[][5] = { // male - {TRAINER_CLASS_YOUNGSTER, TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_RICH_BOY, TRAINER_CLASS_CAMPER, TRAINER_CLASS_COOL_TRAINER_M}, + {FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_BUG_CATCHER, FACILITY_CLASS_RICH_BOY, FACILITY_CLASS_CAMPER, FACILITY_CLASS_COOL_TRAINER_M}, // female - {TRAINER_CLASS_LASS, TRAINER_CLASS_SCHOOL_KID_F, TRAINER_CLASS_LADY, TRAINER_CLASS_PICNICKER, TRAINER_CLASS_COOL_TRAINER_F} + {FACILITY_CLASS_LASS, FACILITY_CLASS_SCHOOL_KID_F, FACILITY_CLASS_LADY, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_COOL_TRAINER_F} }; const u8 gUnknown_082082F2[] = { diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 001cd85f6..2691da859 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -823,7 +823,7 @@ u8 GetBankIdentity(u8 slot) return gBanksBySide[slot]; } -u8 GetBankByPlayerAI(u8 slot) +u8 GetBankByIdentity(u8 slot) { u8 i; @@ -1329,35 +1329,27 @@ u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) var |= 1 << 18; return var; } - } - else - { - if (a1) - { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(0))) - var |= 1 << (GetBankByPlayerAI(0) + 16); + } else { + if (a1) { + if (IsAnimBankSpriteVisible(GetBankByIdentity(0))) { + var |= 1 << (GetBankByIdentity(0) + 16); + } } - if (a2) - { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(2))) - { - shift = GetBankByPlayerAI(2) + 16; + if (a2) { + if (IsAnimBankSpriteVisible(GetBankByIdentity(2))) { + shift = GetBankByIdentity(2) + 16; var |= 1 << shift; } } - if (a3) - { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(1))) - { - shift = GetBankByPlayerAI(1) + 16; + if (a3) { + if (IsAnimBankSpriteVisible(GetBankByIdentity(1))) { + shift = GetBankByIdentity(1) + 16; var |= 1 << shift; } } - if (a4) - { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(3))) - { - shift = GetBankByPlayerAI(3) + 16; + if (a4) { + if (IsAnimBankSpriteVisible(GetBankByIdentity(3))) { + shift = GetBankByIdentity(3) + 16; var |= 1 << shift; } } @@ -1372,7 +1364,7 @@ u8 sub_80793A8(u8 a1) u8 unref_sub_80793B0(u8 a1) { - return GetBankByPlayerAI(a1); + return GetBankByIdentity(a1); } void sub_80793C4(struct Sprite *sprite) -- cgit v1.2.3 From 82ab732d673946af609f896dc51639030eb1bd19 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 7 Jan 2018 14:59:16 -0800 Subject: Finish decompiling battle_2 --- src/battle/battle_2.c | 1214 +++++++++++++++++++++++++-- src/battle/battle_3.c | 24 +- src/battle/battle_4.c | 69 +- src/battle/battle_controller_linkopponent.c | 8 +- src/battle/battle_controller_linkpartner.c | 8 +- src/battle/battle_controller_opponent.c | 8 +- src/battle/battle_controller_player.c | 34 +- src/battle/battle_controller_safari.c | 14 +- src/battle/battle_controller_wally.c | 14 +- src/battle/reshow_battle_screen.c | 10 +- src/contest.c | 24 +- src/debug/matsuda_debug_menu.c | 12 +- src/field/tv.c | 2 +- src/scene/evolution_scene.c | 24 +- src/unknown_task.c | 8 +- 15 files changed, 1295 insertions(+), 178 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 92e9e3e1d..a30245081 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1,13 +1,17 @@ #include "global.h" #include "constants/abilities.h" #include "battle.h" +#include "battle_ai.h" #include "battle_interface.h" +#include "battle_message.h" #include "battle_setup.h" #include "data2.h" #include "event_data.h" +#include "evolution_scene.h" #include "item.h" #include "link.h" #include "main.h" +#include "m4a.h" #include "name_string_util.h" #include "palette.h" #include "party_menu.h" @@ -15,6 +19,7 @@ #include "pokedex.h" #include "pokemon.h" #include "random.h" +#include "roamer.h" #include "rom3.h" #include "rom_8077ABC.h" #include "rom_8094928.h" @@ -22,10 +27,12 @@ #include "sound.h" #include "constants/species.h" #include "sprite.h" +#include "string_util.h" #include "task.h" #include "text.h" #include "trainer.h" #include "trig.h" +#include "tv.h" #include "unknown_task.h" #include "util.h" #include "constants/battle_move_effects.h" @@ -60,7 +67,7 @@ extern const u16 gUnknown_08D004E0[]; extern const struct MonCoords gCastformFrontSpriteCoords[]; extern u8 gStatStageRatios[][2]; -extern u8 gUnknown_02024A76[4]; +extern u8 gActionsByTurnOrder[4]; extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; extern u8 gBattleBufferB[][0x200]; extern u8 gActiveBank; @@ -68,7 +75,7 @@ extern u32 gBattleExecBuffer; extern u8 gNoOfAllBanks; extern u16 gBattlePartyID[]; extern u8 gCurrentActionFuncId; -extern u8 gTurnOrder[]; +extern u8 gBanksByTurnOrder[]; extern struct UnknownStruct12 gUnknown_02024AD0[]; extern u8 gObjectBankIDs[]; extern u16 gCurrentMove; @@ -82,7 +89,7 @@ extern u16 gLastUsedMove[]; extern u16 gMoveHitWith[]; extern u16 gUnknown_02024C44[]; extern u16 gUnknown_02024C4C[]; -extern u16 gLockedMove[]; +extern u16 gLockedMoves[]; extern u8 gUnknown_02024C5C[]; extern u16 gChosenMovesByBanks[]; extern u32 gHitMarker; @@ -112,8 +119,8 @@ extern u16 gBattle_WIN0V; extern u16 gBattle_BG2_Y; extern u32 gUnknown_03004284; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u16 gBattle_WIN0H; extern MainCallback gPreBattleCallback1; @@ -140,10 +147,33 @@ extern u8 gCurrentTurnActionNumber; extern void (* const gUnknown_081FA640[])(void); extern void (* const gUnknown_081FA678[])(void); extern u8* gBattlescriptCurrInstr; -extern u8 gUnknown_081D8E02[]; +extern u8 BattleScript_LinkBattleWonOrLost[]; extern u8 BattleScript_PayDayMoneyAndPickUpItems[]; extern u8 gUnknown_081D8E0D[]; extern u8 BattleScript_LocalTrainerBattleWon[]; +extern u8 BattleScript_LocalBattleLost[]; +extern u8 BattleScript_GotAwaySafely[]; +extern u8 BattleScript_SmokeBallEscape[]; +extern u8 BattleScript_RanAwayUsingMonAbility[]; +extern u8 BattleScript_WildMonFled[]; +extern u8 BattleScript_ActionSwitch[]; +extern u8 BattleScript_PrintFailedToRunString[]; +extern const BattleCmdFunc gBattleScriptingCommandsTable[]; +extern u8 gCritMultiplier; +extern u8 gCurrMovePos; +extern u8 gUnknown_02024BE5; +extern u16 gChosenMove; +extern u8* gBattleScriptsForMoveEffects[]; +extern u16 gLastUsedItem; +extern u8 * const gBattlescriptsForBallThrow[]; +extern u8 * const gBattlescriptsForRunningByItem[]; +extern u8 * const gBattlescriptsForUsingItem[]; +extern u8 * const gBattlescriptsForSafariActions[]; +extern u8 gBattleTextBuff2[]; +extern u8 gNumSafariBalls; +extern u8 gUnknown_081FA70C[][3]; +extern u8 gUnknown_081FA71B[]; +extern u8 gUnknown_081FA71F[]; void b_call_bc_move_exec(const u8* BS_ptr); @@ -153,7 +183,11 @@ void SetActionsAndBanksTurnOrder(void); static void TurnValuesCleanUp(u8); void SpecialStatusesClear(void); static void RunTurnActionsFunctions(void); -void sub_8013C9C(); +void HandleEndTurn_FinishBattle(); +static void FreeResetData_ReturnToOvOrDoEvolutions(void); +void TryEvolvePokemon(void); +static void ReturnFromBattleToOverworld(void); +static void WaitForEvoSceneToFinish(void); void sub_800E7C4(void) { @@ -202,8 +236,8 @@ void InitBattle(void) sub_80895F8(gUnknown_081F9674); SetUpWindowConfig(&gWindowConfig_81E6C58); ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; @@ -491,7 +525,7 @@ void sub_800EC9C(void) { gPreBattleCallback1 = gMain.callback1; gMain.callback1 = sub_8010824; - SetMainCallback2(sub_800F808); + SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTrainerBattleOpponent = 0x800; @@ -849,7 +883,7 @@ void sub_800F298(void) { gPreBattleCallback1 = gMain.callback1; gMain.callback1 = sub_8010824; - SetMainCallback2(sub_800F808); + SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTrainerBattleOpponent = 0x800; @@ -860,7 +894,7 @@ void sub_800F298(void) } } -void sub_800F808(void) +void BattleMainCB2(void) { AnimateSprites(); BuildOamBuffer(); @@ -1024,8 +1058,8 @@ void sub_800FCD4(void) void sub_800FCFC(void) { Random(); // unused return value - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; @@ -1178,8 +1212,8 @@ void c2_8011A1C(void) } SetUpWindowConfig(&gWindowConfig_81E6C58); ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; @@ -1549,7 +1583,7 @@ void sub_8010874(void) gUnknown_02024C44[i] = 0; gUnknown_02024C4C[i] = 0; gUnknown_02024C5C[i] = 0xFF; - gLockedMove[i] = 0; + gLockedMoves[i] = 0; gUnknown_02024C2C[i] = 0; eFlashFireArr.arr[i] = 0; } @@ -2098,12 +2132,12 @@ void BattleBeginFirstTurn(void) if (ewram16058 == 0) { for (i = 0; i < gNoOfAllBanks; i++) - gTurnOrder[i] = i; + gBanksByTurnOrder[i] = i; for (i = 0; i < gNoOfAllBanks - 1; i++) { for (j = i + 1; j < gNoOfAllBanks; j++) { - if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 1) != 0) + if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 1) != 0) SwapTurnOrder(i, j); } } @@ -2115,7 +2149,7 @@ void BattleBeginFirstTurn(void) } while (ewram16058 < gNoOfAllBanks) { - if (AbilityBattleEffects(0, gTurnOrder[ewram16058], 0, 0, 0) != 0) + if (AbilityBattleEffects(0, gBanksByTurnOrder[ewram16058], 0, 0, 0) != 0) r9++; ewram16058++; if (r9 != 0) @@ -2127,7 +2161,7 @@ void BattleBeginFirstTurn(void) return; while (ewram160F9 < gNoOfAllBanks) { - if (ItemBattleEffects(0, gTurnOrder[ewram160F9], 0) != 0) + if (ItemBattleEffects(0, gBanksByTurnOrder[ewram160F9], 0) != 0) r9++; ewram160F9++; if (r9 != 0) @@ -2199,7 +2233,7 @@ void BattleTurnPassed(void) if (TurnBasedEffects() != 0) return; } - if (sub_80173A4() != 0) + if (HandleFaintedMonActions() != 0) return; ewram16059 = 0; if (sub_80170DC() != 0) @@ -3861,13 +3895,13 @@ void SwapTurnOrder(u8 a, u8 b) { int temp; - temp = gUnknown_02024A76[a]; - gUnknown_02024A76[a] = gUnknown_02024A76[b]; - gUnknown_02024A76[b] = temp; + temp = gActionsByTurnOrder[a]; + gActionsByTurnOrder[a] = gActionsByTurnOrder[b]; + gActionsByTurnOrder[b] = temp; - temp = gTurnOrder[a]; - gTurnOrder[a] = gTurnOrder[b]; - gTurnOrder[b] = temp; + temp = gBanksByTurnOrder[a]; + gBanksByTurnOrder[a] = gBanksByTurnOrder[b]; + gBanksByTurnOrder[b] = temp; } // Determines which of the two given mons will strike first in a battle. @@ -4024,8 +4058,8 @@ void SetActionsAndBanksTurnOrder(void) { for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) { - gUnknown_02024A76[var] = gActionForBanks[gActiveBank]; - gTurnOrder[var] = gActiveBank; + gActionsByTurnOrder[var] = gActionForBanks[gActiveBank]; + gBanksByTurnOrder[var] = gActiveBank; var++; } } @@ -4053,15 +4087,15 @@ void SetActionsAndBanksTurnOrder(void) if (var == 5) { - gUnknown_02024A76[0] = gActionForBanks[gActiveBank]; - gTurnOrder[0] = gActiveBank; + gActionsByTurnOrder[0] = gActionForBanks[gActiveBank]; + gBanksByTurnOrder[0] = gActiveBank; var = 1; for (i = 0; i < gNoOfAllBanks; i++) { if (i != gActiveBank) { - gUnknown_02024A76[var] = gActionForBanks[i]; - gTurnOrder[var] = i; + gActionsByTurnOrder[var] = gActionForBanks[i]; + gBanksByTurnOrder[var] = i; var++; } } @@ -4075,8 +4109,8 @@ void SetActionsAndBanksTurnOrder(void) { if (gActionForBanks[gActiveBank] == ACTION_USE_ITEM || gActionForBanks[gActiveBank] == ACTION_SWITCH) { - gUnknown_02024A76[var] = gActionForBanks[gActiveBank]; - gTurnOrder[var] = gActiveBank; + gActionsByTurnOrder[var] = gActionForBanks[gActiveBank]; + gBanksByTurnOrder[var] = gActiveBank; var++; } } @@ -4084,8 +4118,8 @@ void SetActionsAndBanksTurnOrder(void) { if (gActionForBanks[gActiveBank] != ACTION_USE_ITEM && gActionForBanks[gActiveBank] != ACTION_SWITCH) { - gUnknown_02024A76[var] = gActionForBanks[gActiveBank]; - gTurnOrder[var] = gActiveBank; + gActionsByTurnOrder[var] = gActionForBanks[gActiveBank]; + gBanksByTurnOrder[var] = gActiveBank; var++; } } @@ -4093,12 +4127,12 @@ void SetActionsAndBanksTurnOrder(void) { for (j = i + 1; j < gNoOfAllBanks; j++) { - u8 bank1 = gTurnOrder[i]; - u8 bank2 = gTurnOrder[j]; - if (gUnknown_02024A76[i] != ACTION_USE_ITEM - && gUnknown_02024A76[j] != ACTION_USE_ITEM - && gUnknown_02024A76[i] != ACTION_SWITCH - && gUnknown_02024A76[j] != ACTION_SWITCH) + u8 bank1 = gBanksByTurnOrder[i]; + u8 bank2 = gBanksByTurnOrder[j]; + if (gActionsByTurnOrder[i] != ACTION_USE_ITEM + && gActionsByTurnOrder[j] != ACTION_USE_ITEM + && gActionsByTurnOrder[i] != ACTION_SWITCH + && gActionsByTurnOrder[j] != ACTION_SWITCH) { if (GetWhoStrikesFirst(bank1, bank2, FALSE)) SwapTurnOrder(i, j); @@ -4184,7 +4218,7 @@ void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) { // something stupid needed to match u8 zero; - gCurrentActionFuncId = gUnknown_02024A76[(zero = 0)]; + gCurrentActionFuncId = gActionsByTurnOrder[(zero = 0)]; } gDynamicBasePower = 0; @@ -4227,7 +4261,7 @@ void HandleEndTurn_BattleWon(void) { gBattleTextBuff1[0] = gBattleOutcome; gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1); - gBattlescriptCurrInstr = gUnknown_081D8E02; + gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); } else if (gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) @@ -4266,5 +4300,1091 @@ void HandleEndTurn_BattleWon(void) gBattlescriptCurrInstr = BattleScript_PayDayMoneyAndPickUpItems; } - gBattleMainFunc = sub_8013C9C; + gBattleMainFunc = HandleEndTurn_FinishBattle; +} + +void HandleEndTurn_BattleLost(void) +{ + gCurrentActionFuncId = 0; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gBattleTextBuff1[0] = gBattleOutcome; + gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1); + gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; + gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN); + } + else + { + gBattlescriptCurrInstr = BattleScript_LocalBattleLost; + } + + gBattleMainFunc = HandleEndTurn_FinishBattle; +} + +void HandleEndTurn_RanFromBattle(void) +{ + gCurrentActionFuncId = 0; + + switch (gProtectStructs[gBankAttacker].fleeFlag) + { + default: + gBattlescriptCurrInstr = BattleScript_GotAwaySafely; + break; + case 1: + gBattlescriptCurrInstr = BattleScript_SmokeBallEscape; + break; + case 2: + gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility; + break; + } + + gBattleMainFunc = HandleEndTurn_FinishBattle; +} + +void HandleEndTurn_MonFled(void) +{ + gCurrentActionFuncId = 0; + + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker]); + gBattlescriptCurrInstr = BattleScript_WildMonFled; + + gBattleMainFunc = HandleEndTurn_FinishBattle; +} + +void HandleEndTurn_FinishBattle(void) +{ + if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC) + { + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_FIRST_BATTLE + | BATTLE_TYPE_SAFARI + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_WALLY_TUTORIAL + | BATTLE_TYPE_BATTLE_TOWER))) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (GetBankSide(gActiveBank) == SIDE_PLAYER) + { + if (gBattleResults.poke1Species == SPECIES_NONE) + { + gBattleResults.poke1Species = gBattleMons[gActiveBank].species; + StringCopy(gBattleResults.pokeString1, gBattleMons[gActiveBank].nickname); + } + else + { + gBattleResults.opponentSpecies = gBattleMons[gActiveBank].species; + StringCopy(gBattleResults.pokeString2, gBattleMons[gActiveBank].nickname); + } + } + } + PutPokemonTodayCaughtOnAir(); + } + + BeginFastPaletteFade(3); + FadeOutMapMusic(5); + gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; + gCB2_AfterEvolution = BattleMainCB2; + } + else + { + if (gBattleExecBuffer == 0) + gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); + } +} + +static void FreeResetData_ReturnToOvOrDoEvolutions(void) +{ + if (!gPaletteFade.active) + { + ResetSpriteData(); + if (gLeveledUpInBattle == 0 || gBattleOutcome != BATTLE_WON) + { + gBattleMainFunc = ReturnFromBattleToOverworld; + return; + } + else + { + gBattleMainFunc = TryEvolvePokemon; + } + } +} + +void TryEvolvePokemon(void) +{ + s32 i; + + while (gLeveledUpInBattle != 0) + { + for (i = 0; i < 6; i++) + { + if (gLeveledUpInBattle & gBitTable[i]) + { + u16 species; + u8 levelUpBits = gLeveledUpInBattle; + + levelUpBits &= ~(gBitTable[i]); + gLeveledUpInBattle = levelUpBits; + + species = GetEvolutionTargetSpecies(&gPlayerParty[i], 0, levelUpBits); + if (species != SPECIES_NONE) + { + gBattleMainFunc = WaitForEvoSceneToFinish; + EvolutionScene(&gPlayerParty[i], species, 0x81, i); + return; + } + } + } + } + + gBattleMainFunc = ReturnFromBattleToOverworld; +} + +static void WaitForEvoSceneToFinish(void) +{ + if (gMain.callback2 == BattleMainCB2) + gBattleMainFunc = TryEvolvePokemon; +} + +static void ReturnFromBattleToOverworld(void) +{ + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) + { + RandomlyGivePartyPokerus(gPlayerParty); + PartySpreadPokerus(gPlayerParty); + } + + if (gBattleTypeFlags & BATTLE_TYPE_LINK && gReceivedRemoteLinkPlayers != 0) + return; + + gSpecialVar_Result = gBattleOutcome; + gMain.inBattle = 0; + gMain.callback1 = gPreBattleCallback1; + + if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) + { + UpdateRoamerHPStatus(&gEnemyParty[0]); + if (gBattleOutcome == BATTLE_WON || gBattleOutcome == BATTLE_CAUGHT) + SetRoamerInactive(); + } + + m4aSongNumStop(0x5A); + SetMainCallback2(gMain.savedCallback); +} + +void RunBattleScriptCommands_PopCallbacksStack(void) +{ + if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC) + { + if (B_FUNCTION_STACK->size != 0) + B_FUNCTION_STACK->size--; + gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; + } + else + { + if (gBattleExecBuffer == 0) + gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); + } +} + +void RunBattleScriptCommands(void) +{ + if (gBattleExecBuffer == 0) + gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); +} + +void HandleAction_UseMove(void) +{ + u8 side; + u8 var = 4; + + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + + if (ewram160A6 & gBitTable[gBankAttacker]) + { + gCurrentActionFuncId = ACTION_FINISHED; + return; + } + + gCritMultiplier = 1; + eDmgMultiplier = 1; + ewram160E7 = 0; + gBattleMoveFlags = 0; + gMultiHitCounter = 0; + gBattleCommunication[6] = 0; + gCurrMovePos = gUnknown_02024BE5 = ewram1608Carr(gBankAttacker); + + // choose move + if (gProtectStructs[gBankAttacker].onlyStruggle) + { + gProtectStructs[gBankAttacker].onlyStruggle = 0; + gCurrentMove = gChosenMove = MOVE_STRUGGLE; + gHitMarker |= HITMARKER_NO_PPDEDUCT; + ewram16010arr(gBankAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0); + } + else if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE) + { + gCurrentMove = gChosenMove = gLockedMoves[gBankAttacker]; + } + // encore forces you to use the same move + else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE + && gDisableStructs[gBankAttacker].encoredMove == gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos]) + { + gCurrentMove = gChosenMove = gDisableStructs[gBankAttacker].encoredMove; + gCurrMovePos = gUnknown_02024BE5 = gDisableStructs[gBankAttacker].encoredMovePos; + ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); + } + // check if the encored move wasn't overwritten + else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE + && gDisableStructs[gBankAttacker].encoredMove != gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos]) + { + gCurrMovePos = gUnknown_02024BE5 = gDisableStructs[gBankAttacker].encoredMovePos; + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + gDisableStructs[gBankAttacker].encoredMove = MOVE_NONE; + gDisableStructs[gBankAttacker].encoredMovePos = 0; + gDisableStructs[gBankAttacker].encoreTimer1 = 0; + ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); + } + else if (gBattleMons[gBankAttacker].moves[gCurrMovePos] != gChosenMovesByBanks[gBankAttacker]) + { + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0); + } + else + { + gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + } + + if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + gBattleResults.lastUsedMove = gCurrentMove; + else + gBattleResults.opponentMove = gCurrentMove; + + // choose target + side = GetBankSide(gBankAttacker) ^ BIT_SIDE; + if (gSideTimers[side].followmeTimer != 0 + && gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED + && GetBankSide(gBankAttacker) != GetBankSide(gSideTimers[side].followmeTarget) + && gBattleMons[gSideTimers[side].followmeTarget].hp != 0) + { + gBankTarget = gSideTimers[side].followmeTarget; + } + else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + && gSideTimers[side].followmeTimer == 0 + && (gBattleMoves[gCurrentMove].power != 0 + || gBattleMoves[gCurrentMove].target != MOVE_TARGET_x10) + && gBattleMons[ewram16010arr(gBankAttacker)].ability != ABILITY_LIGHTNING_ROD + && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) + { + side = GetBankSide(gBankAttacker); + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (side != GetBankSide(gActiveBank) + && ewram16010arr(gBankAttacker) != gActiveBank + && gBattleMons[gActiveBank].ability == ABILITY_LIGHTNING_ROD + && BankGetTurnOrder(gActiveBank) < var) + { + var = BankGetTurnOrder(gActiveBank); + } + } + if (var == 4) + { + if (gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) + { + if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + { + if (Random() & 1) + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + else + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2); + } + else + { + if (Random() & 1) + gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1); + else + gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2); + } + } + else + { + gBankTarget = ewram16010arr(gBankAttacker); + } + + if (gAbsentBankFlags & gBitTable[gBankTarget]) + { + if (GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)) + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + else + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_SIDE); + if (gAbsentBankFlags & gBitTable[gBankTarget]) + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + } + } + else + { + gActiveBank = gBanksByTurnOrder[var]; + RecordAbilityBattle(gActiveBank, gBattleMons[gActiveBank].ability); + gSpecialStatuses[gActiveBank].lightningRodRedirected = 1; + gBankTarget = gActiveBank; + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM) + { + if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + { + if (Random() & 1) + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + else + gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2); + } + else + { + if (Random() & 1) + gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1); + else + gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2); + } + + if (gAbsentBankFlags & gBitTable[gBankTarget] + && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)) + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + } + else + { + gBankTarget = ewram16010arr(gBankAttacker); + if (gAbsentBankFlags & gBitTable[gBankTarget]) + { + if (GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)) + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + else + { + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_SIDE); + if (gAbsentBankFlags & gBitTable[gBankTarget]) + gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON); + } + } + } + + gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_Switch(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gActionSelectionCursor[gBankAttacker] = 0; + gMoveSelectionCursor[gBankAttacker] = 0; + + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, ewram16064arr(gBankAttacker)) + + ewram16003 = gBankAttacker; + gBattlescriptCurrInstr = BattleScript_ActionSwitch; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; + + if (gBattleResults.unk2 < 255) + gBattleResults.unk2++; +} + +#ifdef NONMATCHING +void HandleAction_UseItem(void) +{ + gBankAttacker = gBankTarget = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gDisableStructs[gBankAttacker].furyCutterCounter = 0; + gLastUsedItem = gBattleBufferB[gBankAttacker][1] | (gBattleBufferB[gBankAttacker][2] << 8); + + if (gLastUsedItem <= ITEM_PREMIER_BALL) // is ball + { + gBattlescriptCurrInstr = gBattlescriptsForBallThrow[gLastUsedItem]; + } + else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL) + { + gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0]; + } + else if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + { + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0]; + } + else + { + ewram16003 = gBankAttacker; + + switch (ewram160D8(gBankAttacker)) + { + case AI_ITEM_FULL_RESTORE: + case AI_ITEM_HEAL_HP: + break; + case AI_ITEM_CURE_CONDITION: + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + if (ewram160DA(gBankAttacker) & 1) + { + if (ewram160DA(gBankAttacker) & 0x3E) + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + else + { + while (!(ewram160DA(gBankAttacker) & 1)) + { + ewram160DA(gBankAttacker) /= 2; + gBattleCommunication[MULTISTRING_CHOOSER]++; + } + } + break; + case AI_ITEM_X_STAT: + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + if (ewram160DA(gBankAttacker) & 0x80) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + else + { + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK) + PREPARE_STRING_BUFFER(gBattleTextBuff2, 0xD2) + + while (!(ewram160DA(gBankAttacker) & 1)) + { + ewram160DA(gBankAttacker) /= 2; + gBattleTextBuff1[2]++; + } + + ewram160A4 = gBattleTextBuff1[2] + 14; + ewram160A5 = 0; + } + break; + case AI_ITEM_GUARD_SPECS: + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + break; + } + + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[ewram160D8(gBankAttacker)]; + } + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} +#else +__attribute__((naked)) +void HandleAction_UseItem(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r4, _08014804 @ =gBankAttacker\n\ + ldr r2, _08014808 @ =gBankTarget\n\ + ldr r1, _0801480C @ =gBanksByTurnOrder\n\ + ldr r0, _08014810 @ =gCurrentTurnActionNumber\n\ + ldrb r0, [r0]\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r2]\n\ + strb r0, [r4]\n\ + ldr r0, _08014814 @ =gBattle_BG0_X\n\ + movs r2, 0\n\ + strh r2, [r0]\n\ + ldr r0, _08014818 @ =gBattle_BG0_Y\n\ + strh r2, [r0]\n\ + ldr r3, _0801481C @ =gDisableStructs\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 3\n\ + subs r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + strb r2, [r0, 0x10]\n\ + ldr r5, _08014820 @ =gLastUsedItem\n\ + ldr r2, _08014824 @ =gBattleBufferB\n\ + ldrb r1, [r4]\n\ + lsls r1, 9\n\ + adds r0, r2, 0x1\n\ + adds r0, r1, r0\n\ + ldrb r3, [r0]\n\ + adds r2, 0x2\n\ + adds r1, r2\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r3, r0\n\ + strh r3, [r5]\n\ + cmp r3, 0xC\n\ + bhi _08014830\n\ + ldr r2, _08014828 @ =gBattlescriptCurrInstr\n\ + ldr r1, _0801482C @ =gBattlescriptsForBallThrow\n\ + ldrh r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + str r0, [r2]\n\ + b _08014A8C\n\ + .align 2, 0\n\ +_08014804: .4byte gBankAttacker\n\ +_08014808: .4byte gBankTarget\n\ +_0801480C: .4byte gBanksByTurnOrder\n\ +_08014810: .4byte gCurrentTurnActionNumber\n\ +_08014814: .4byte gBattle_BG0_X\n\ +_08014818: .4byte gBattle_BG0_Y\n\ +_0801481C: .4byte gDisableStructs\n\ +_08014820: .4byte gLastUsedItem\n\ +_08014824: .4byte gBattleBufferB\n\ +_08014828: .4byte gBattlescriptCurrInstr\n\ +_0801482C: .4byte gBattlescriptsForBallThrow\n\ +_08014830:\n\ + adds r0, r3, 0\n\ + subs r0, 0x50\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _0801484C\n\ + ldr r0, _08014844 @ =gBattlescriptCurrInstr\n\ + ldr r1, _08014848 @ =gBattlescriptsForRunningByItem\n\ + b _0801485C\n\ + .align 2, 0\n\ +_08014844: .4byte gBattlescriptCurrInstr\n\ +_08014848: .4byte gBattlescriptsForRunningByItem\n\ +_0801484C:\n\ + ldrb r0, [r4]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0801486C\n\ + ldr r0, _08014864 @ =gBattlescriptCurrInstr\n\ + ldr r1, _08014868 @ =gBattlescriptsForUsingItem\n\ +_0801485C:\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08014A8C\n\ + .align 2, 0\n\ +_08014864: .4byte gBattlescriptCurrInstr\n\ +_08014868: .4byte gBattlescriptsForUsingItem\n\ +_0801486C:\n\ + ldr r2, _080148A0 @ =gSharedMem\n\ + ldrb r0, [r4]\n\ + ldr r3, _080148A4 @ =0x00016003\n\ + adds r1, r2, r3\n\ + strb r0, [r1]\n\ + lsls r0, 24\n\ + lsrs r0, 25\n\ + ldr r1, _080148A8 @ =0x000160d8\n\ + adds r0, r1\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + subs r0, 0x1\n\ + mov r8, r4\n\ + ldr r3, _080148AC @ =gBattlescriptCurrInstr\n\ + mov r9, r3\n\ + ldr r1, _080148B0 @ =gBattlescriptsForUsingItem\n\ + mov r10, r1\n\ + adds r7, r2, 0\n\ + cmp r0, 0x4\n\ + bls _08014896\n\ + b _08014A74\n\ +_08014896:\n\ + lsls r0, 2\n\ + ldr r1, _080148B4 @ =_080148B8\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_080148A0: .4byte gSharedMem\n\ +_080148A4: .4byte 0x00016003\n\ +_080148A8: .4byte 0x000160d8\n\ +_080148AC: .4byte gBattlescriptCurrInstr\n\ +_080148B0: .4byte gBattlescriptsForUsingItem\n\ +_080148B4: .4byte _080148B8\n\ + .align 2, 0\n\ +_080148B8:\n\ + .4byte _08014A74\n\ + .4byte _08014A74\n\ + .4byte _080148CC\n\ + .4byte _08014958\n\ + .4byte _08014A30\n\ +_080148CC:\n\ + ldr r2, _08014904 @ =gBattleCommunication\n\ + movs r0, 0\n\ + strb r0, [r2, 0x5]\n\ + ldr r1, _08014908 @ =gBankAttacker\n\ + ldrb r0, [r1]\n\ + lsrs r0, 1\n\ + ldr r6, _0801490C @ =0x000160da\n\ + adds r0, r6\n\ + adds r0, r7\n\ + ldrb r3, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r3\n\ + mov r8, r1\n\ + cmp r0, 0\n\ + beq _08014918\n\ + movs r0, 0x3E\n\ + ands r0, r3\n\ + ldr r3, _08014910 @ =gBattlescriptCurrInstr\n\ + mov r9, r3\n\ + ldr r1, _08014914 @ =gBattlescriptsForUsingItem\n\ + mov r10, r1\n\ + cmp r0, 0\n\ + bne _080148FC\n\ + b _08014A74\n\ +_080148FC:\n\ + movs r0, 0x5\n\ + strb r0, [r2, 0x5]\n\ + b _08014A74\n\ + .align 2, 0\n\ +_08014904: .4byte gBattleCommunication\n\ +_08014908: .4byte gBankAttacker\n\ +_0801490C: .4byte 0x000160da\n\ +_08014910: .4byte gBattlescriptCurrInstr\n\ +_08014914: .4byte gBattlescriptsForUsingItem\n\ +_08014918:\n\ + ldr r3, _08014950 @ =gBattlescriptCurrInstr\n\ + mov r9, r3\n\ + ldr r0, _08014954 @ =gBattlescriptsForUsingItem\n\ + mov r10, r0\n\ + adds r5, r7, 0\n\ + mov r4, r8\n\ + adds r3, r6, 0\n\ +_08014926:\n\ + ldrb r0, [r4]\n\ + lsrs r0, 1\n\ + adds r0, r3\n\ + adds r0, r5\n\ + ldrb r1, [r0]\n\ + lsrs r1, 1\n\ + strb r1, [r0]\n\ + ldrb r0, [r2, 0x5]\n\ + adds r0, 0x1\n\ + strb r0, [r2, 0x5]\n\ + ldrb r0, [r4]\n\ + lsrs r0, 1\n\ + adds r0, r3\n\ + adds r0, r5\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08014926\n\ + b _08014A74\n\ + .align 2, 0\n\ +_08014950: .4byte gBattlescriptCurrInstr\n\ +_08014954: .4byte gBattlescriptsForUsingItem\n\ +_08014958:\n\ + ldr r3, _0801498C @ =gBattleCommunication\n\ + movs r0, 0x4\n\ + strb r0, [r3, 0x5]\n\ + ldr r2, _08014990 @ =gBankAttacker\n\ + ldrb r0, [r2]\n\ + lsrs r0, 1\n\ + ldr r1, _08014994 @ =0x000160da\n\ + mov r12, r1\n\ + add r0, r12\n\ + adds r6, r0, r7\n\ + ldrb r1, [r6]\n\ + movs r0, 0x80\n\ + ands r0, r1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + mov r8, r2\n\ + cmp r5, 0\n\ + beq _080149A0\n\ + movs r0, 0x5\n\ + strb r0, [r3, 0x5]\n\ + ldr r2, _08014998 @ =gBattlescriptCurrInstr\n\ + mov r9, r2\n\ + ldr r3, _0801499C @ =gBattlescriptsForUsingItem\n\ + mov r10, r3\n\ + b _08014A74\n\ + .align 2, 0\n\ +_0801498C: .4byte gBattleCommunication\n\ +_08014990: .4byte gBankAttacker\n\ +_08014994: .4byte 0x000160da\n\ +_08014998: .4byte gBattlescriptCurrInstr\n\ +_0801499C: .4byte gBattlescriptsForUsingItem\n\ +_080149A0:\n\ + ldr r3, _08014A18 @ =gBattleTextBuff1\n\ + movs r4, 0xFD\n\ + strb r4, [r3]\n\ + movs r0, 0x5\n\ + strb r0, [r3, 0x1]\n\ + movs r2, 0x1\n\ + strb r2, [r3, 0x2]\n\ + movs r0, 0xFF\n\ + strb r0, [r3, 0x3]\n\ + ldr r1, _08014A1C @ =gBattleTextBuff2\n\ + strb r4, [r1]\n\ + strb r5, [r1, 0x1]\n\ + movs r0, 0xD2\n\ + strb r0, [r1, 0x2]\n\ + strb r5, [r1, 0x3]\n\ + subs r0, 0xD3\n\ + strb r0, [r1, 0x4]\n\ + ldrb r0, [r6]\n\ + ands r2, r0\n\ + ldr r0, _08014A20 @ =gBattlescriptCurrInstr\n\ + mov r9, r0\n\ + ldr r1, _08014A24 @ =gBattlescriptsForUsingItem\n\ + mov r10, r1\n\ + adds r6, r3, 0\n\ + cmp r2, 0\n\ + bne _08014A02\n\ + adds r3, r7, 0\n\ + mov r5, r8\n\ + mov r4, r12\n\ + adds r2, r6, 0\n\ +_080149DC:\n\ + ldrb r0, [r5]\n\ + lsrs r0, 1\n\ + adds r0, r4\n\ + adds r0, r3\n\ + ldrb r1, [r0]\n\ + lsrs r1, 1\n\ + strb r1, [r0]\n\ + ldrb r0, [r2, 0x2]\n\ + adds r0, 0x1\n\ + strb r0, [r2, 0x2]\n\ + ldrb r0, [r5]\n\ + lsrs r0, 1\n\ + adds r0, r4\n\ + adds r0, r3\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080149DC\n\ +_08014A02:\n\ + ldrb r0, [r6, 0x2]\n\ + adds r0, 0xE\n\ + ldr r2, _08014A28 @ =0x000160a4\n\ + adds r1, r7, r2\n\ + movs r2, 0\n\ + strb r0, [r1]\n\ + ldr r3, _08014A2C @ =0x000160a5\n\ + adds r0, r7, r3\n\ + strb r2, [r0]\n\ + b _08014A74\n\ + .align 2, 0\n\ +_08014A18: .4byte gBattleTextBuff1\n\ +_08014A1C: .4byte gBattleTextBuff2\n\ +_08014A20: .4byte gBattlescriptCurrInstr\n\ +_08014A24: .4byte gBattlescriptsForUsingItem\n\ +_08014A28: .4byte 0x000160a4\n\ +_08014A2C: .4byte 0x000160a5\n\ +_08014A30:\n\ + ldr r0, _08014A50 @ =gBattleTypeFlags\n\ + ldrh r0, [r0]\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _08014A64\n\ + ldr r1, _08014A54 @ =gBattleCommunication\n\ + movs r0, 0x2\n\ + strb r0, [r1, 0x5]\n\ + ldr r0, _08014A58 @ =gBankAttacker\n\ + mov r8, r0\n\ + ldr r1, _08014A5C @ =gBattlescriptCurrInstr\n\ + mov r9, r1\n\ + ldr r2, _08014A60 @ =gBattlescriptsForUsingItem\n\ + mov r10, r2\n\ + b _08014A74\n\ + .align 2, 0\n\ +_08014A50: .4byte gBattleTypeFlags\n\ +_08014A54: .4byte gBattleCommunication\n\ +_08014A58: .4byte gBankAttacker\n\ +_08014A5C: .4byte gBattlescriptCurrInstr\n\ +_08014A60: .4byte gBattlescriptsForUsingItem\n\ +_08014A64:\n\ + ldr r0, _08014AA0 @ =gBattleCommunication\n\ + strb r1, [r0, 0x5]\n\ + ldr r3, _08014AA4 @ =gBankAttacker\n\ + mov r8, r3\n\ + ldr r0, _08014AA8 @ =gBattlescriptCurrInstr\n\ + mov r9, r0\n\ + ldr r1, _08014AAC @ =gBattlescriptsForUsingItem\n\ + mov r10, r1\n\ +_08014A74:\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + lsrs r0, 1\n\ + ldr r3, _08014AB0 @ =0x000160d8\n\ + adds r0, r3\n\ + adds r0, r7\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + add r0, r10\n\ + ldr r0, [r0]\n\ + mov r1, r9\n\ + str r0, [r1]\n\ +_08014A8C:\n\ + movs r0, 0xA\n\ + ldr r2, _08014AB4 @ =gCurrentActionFuncId\n\ + strb r0, [r2]\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08014AA0: .4byte gBattleCommunication\n\ +_08014AA4: .4byte gBankAttacker\n\ +_08014AA8: .4byte gBattlescriptCurrInstr\n\ +_08014AAC: .4byte gBattlescriptsForUsingItem\n\ +_08014AB0: .4byte 0x000160d8\n\ +_08014AB4: .4byte gCurrentActionFuncId\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +bool8 TryRunFromBattle(u8 bank) +{ + bool8 effect = FALSE; + u8 holdEffect; + u8 speedVar; + + if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) + holdEffect = gEnigmaBerries[bank].holdEffect; + else + holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item); + + gStringBank = bank; + + if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) + { + gLastUsedItem = gBattleMons[bank].item ; + gProtectStructs[bank].fleeFlag = 1; + effect++; + } + else if (gBattleMons[bank].ability == ABILITY_RUN_AWAY) + { + gLastUsedAbility = ABILITY_RUN_AWAY; + gProtectStructs[bank].fleeFlag = 2; + effect++; + } + else + { + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + if (gBattleMons[bank].speed < gBattleMons[bank ^ BIT_SIDE].speed) + { + speedVar = (gBattleMons[bank].speed * 128) / (gBattleMons[bank ^ BIT_SIDE].speed) + (ewram16078 * 30); + if (speedVar > (Random() & 0xFF)) + effect++; + } + else // same speed or faster + { + effect++; + } + } + + ewram16078++; + } + + if (effect) + { + gCurrentTurnActionNumber = gNoOfAllBanks; + gBattleOutcome = BATTLE_RAN; + } + + return effect; +} + +void HandleAction_Run(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gCurrentTurnActionNumber = gNoOfAllBanks; + + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (GetBankSide(gActiveBank) == SIDE_PLAYER) + { + if (gActionForBanks[gActiveBank] == ACTION_RUN) + gBattleOutcome |= BATTLE_LOST; + } + else + { + if (gActionForBanks[gActiveBank] == ACTION_RUN) + gBattleOutcome |= BATTLE_WON; + } + } + + gBattleOutcome |= OUTCOME_LINK_BATTLE_RUN; + } + else + { + if (GetBankSide(gBankAttacker) == SIDE_PLAYER) + { + if (!TryRunFromBattle(gBankAttacker)) // failed to run away + { + gBattleMons[gBankAttacker].status2 &= ~STATUS2_DESTINY_BOND; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; + } + } + else + { + if (gBattleMons[gBankAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; + } + else + { + gCurrentTurnActionNumber = gNoOfAllBanks; + gBattleOutcome = BATTLE_POKE_FLED; + } + } + } +} + +void HandleAction_WatchesCarefully(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_SafariZoneBallThrow(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gNumSafariBalls--; + gLastUsedItem = ITEM_SAFARI_BALL; + gBattlescriptCurrInstr = gBattlescriptsForBallThrow[ITEM_SAFARI_BALL]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_ThrowPokeblock(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBankAttacker][1] - 1; + gLastUsedItem = gBattleBufferB[gBankAttacker][2]; + + if (ewram16087 < 3) + ewram16087++; + if (ewram16088 > 1) + { + if (ewram16088 < gUnknown_081FA70C[ewram16087][gBattleCommunication[MULTISTRING_CHOOSER]]) + ewram16088 = 1; + else + ewram16088 -= gUnknown_081FA70C[ewram16087][gBattleCommunication[MULTISTRING_CHOOSER]]; + } + + gBattlescriptCurrInstr = gBattlescriptsForSafariActions[2]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_GoNear(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + + ewram16089 += gUnknown_081FA71B[ewram16086]; + if (ewram16089 > 20) + ewram16089 = 20; + + ewram16088 += gUnknown_081FA71F[ewram16086]; + if (ewram16088 > 20) + ewram16088 = 20; + + if (ewram16086 < 3) + { + ewram16086++; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; +} + +void HandleAction_SafriZoneRun(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + PlaySE(SE_NIGERU); + gCurrentTurnActionNumber = gNoOfAllBanks; + gBattleOutcome = BATTLE_RAN; +} + +void HandleAction_Action9(void) +{ + gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber]; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker]) + + gBattlescriptCurrInstr = gBattlescriptsForSafariActions[3]; + gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT; + gActionsByTurnOrder[1] = ACTION_FINISHED; +} + +void HandleAction_Action11(void) +{ + if (!HandleFaintedMonActions()) + { + ewram16059 = 0; + gCurrentActionFuncId = ACTION_FINISHED; + } +} + +void HandleAction_NothingIsFainted(void) +{ + gCurrentTurnActionNumber++; + gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; + gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED + | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR + | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 + | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT + | HITMARKER_x8000000 | HITMARKER_x4000000); +} + +void HandleAction_ActionFinished(void) +{ + gCurrentTurnActionNumber++; + gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; + SpecialStatusesClear(); + gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED + | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR + | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 + | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT + | HITMARKER_x8000000 | HITMARKER_x4000000); + + gBattleMoveDamage = 0; + ewram16002 = 0; + ewram160A1 = 0; + gMoveHitWith[gBankAttacker] = 0; + gUnknown_02024C44[gBankAttacker] = 0; + eDynamicMoveType = 0; + gDynamicBasePower = 0; + ewram1600C = 0; + gBattleCommunication[3] = 0; + gBattleCommunication[4] = 0; + eMultihitMoveEffect = 0; + ewram17130 = 0; } diff --git a/src/battle/battle_3.c b/src/battle/battle_3.c index cfa188fa4..92e0404cc 100644 --- a/src/battle/battle_3.c +++ b/src/battle/battle_3.c @@ -33,7 +33,7 @@ extern u8 gNoOfAllBanks; extern u32 gStatuses3[4]; extern u8 gBankAttacker; extern u8 gBankTarget; -extern u8 gTurnOrder[4]; +extern u8 gBanksByTurnOrder[4]; extern u16 gSideAffecting[2]; extern u16 gBattleWeather; extern void (*gBattleMainFunc)(void); @@ -87,8 +87,6 @@ u8 weather_get_current(void); void b_push_move_exec(u8* BS_ptr); void RecordAbilityBattle(u8 bank, u8 ability); void RecordItemBattle(u8 bank, u8 holdEffect); -void sub_8013F54(void); -void sub_8013FBC(void); s8 GetPokeFlavourRelation(u32 pid, u8 flavor); extern u8 BattleScript_MoveSelectionDisabledMove[]; @@ -372,14 +370,14 @@ u8 UpdateTurnCounters(void) case 0: for (i = 0; i < gNoOfAllBanks; i++) { - gTurnOrder[i] = i; + gBanksByTurnOrder[i] = i; } for (i = 0; i < gNoOfAllBanks - 1; i++) { s32 j; for (j = i + 1; j < gNoOfAllBanks; j++) { - if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 0)) + if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 0)) SwapTurnOrder(i, j); } } @@ -496,7 +494,7 @@ u8 UpdateTurnCounters(void) case 5: while (BATTLE_STRUCT->turnSideTracker < gNoOfAllBanks) { - gActiveBank = gTurnOrder[BATTLE_STRUCT->turnSideTracker]; + gActiveBank = gBanksByTurnOrder[BATTLE_STRUCT->turnSideTracker]; if (gWishFutureKnock.wishCounter[gActiveBank] && --gWishFutureKnock.wishCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp) { gBankTarget = gActiveBank; @@ -606,7 +604,7 @@ u8 TurnBasedEffects(void) gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); while (BATTLE_STRUCT->turnEffectsBank < gNoOfAllBanks && BATTLE_STRUCT->turnEffectsTracker <= TURNBASED_MAX_CASE) { - gActiveBank = gBankAttacker = gTurnOrder[BATTLE_STRUCT->turnEffectsBank]; + gActiveBank = gBankAttacker = gBanksByTurnOrder[BATTLE_STRUCT->turnEffectsBank]; if (gAbsentBankFlags & gBitTable[gActiveBank]) { BATTLE_STRUCT->turnEffectsBank++; @@ -948,7 +946,7 @@ bool8 sub_80170DC(void) // handle future sight and perish song case 1: // perish song while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks) { - gActiveBank = gBankAttacker = gTurnOrder[BATTLE_STRUCT->sub80170DC_Bank]; + gActiveBank = gBankAttacker = gBanksByTurnOrder[BATTLE_STRUCT->sub80170DC_Bank]; if (gAbsentBankFlags & gBitTable[gActiveBank]) BATTLE_STRUCT->sub80170DC_Bank++; else @@ -984,9 +982,9 @@ bool8 sub_80170DC(void) // handle future sight and perish song return 0; } -#define sub_80173A4_MAX_CASE 7 +#define HandleFaintedMonActions_MAX_CASE 7 -bool8 sub_80173A4(void) +bool8 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return 0; @@ -1053,7 +1051,7 @@ bool8 sub_80173A4(void) case 7: break; } - } while (BATTLE_STRUCT->sub80173A4_Tracker != sub_80173A4_MAX_CASE); + } while (BATTLE_STRUCT->sub80173A4_Tracker != HandleFaintedMonActions_MAX_CASE); return 0; } @@ -2255,7 +2253,7 @@ void b_call_bc_move_exec(u8* BS_ptr) { gBattlescriptCurrInstr = BS_ptr; B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; - gBattleMainFunc = sub_8013F54; + gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack; gCurrentActionFuncId = 0; } @@ -2264,7 +2262,7 @@ void b_push_move_exec(u8* BS_ptr) b_movescr_stack_push_cursor(); gBattlescriptCurrInstr = BS_ptr; B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; - gBattleMainFunc = sub_8013FBC; + gBattleMainFunc = RunBattleScriptCommands; } enum diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index d9789f76d..3b1092e45 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -35,8 +35,8 @@ extern u8 gActiveBank; extern u32 gBattleExecBuffer; extern u8 gNoOfAllBanks; extern u16 gBattlePartyID[4]; -extern u8 gTurnOrder[4]; -extern u8 gUnknown_02024A76[4]; +extern u8 gBanksByTurnOrder[4]; +extern u8 gActionsByTurnOrder[4]; extern u16 gCurrentMove; extern u8 gLastUsedAbility; extern u16 gBattleWeather; @@ -45,7 +45,7 @@ extern u8 gEffectBank; extern u8 gAbsentBankFlags; extern u8 gMultiHitCounter; extern u16 gLastUsedMove[4]; -extern u16 gLockedMove[4]; +extern u16 gLockedMoves[4]; extern u16 gChosenMovesByBanks[4]; extern u16 gSideAffecting[2]; extern u16 gPauseCounterBattle; @@ -145,10 +145,9 @@ bool32 IsHMMove2(u16 move); void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0); void nullsub_6(void); void ReshowBattleScreenAfterMenu(void); -void sub_800F808(void); +void BattleMainCB2(void); void AddMoney(u32* moneySaveblock, u32 to_give); void sub_80156DC(void); //set sentpokes value -bool8 sub_8014AB8(u8 bank); //can run from battle u8 CountAliveMons(u8 caseID); void sub_803E1B0(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); u8 CanRunFromBattle(void); @@ -1074,11 +1073,11 @@ static void atk00_attackcanceler(void) } for (i = 0; i < gNoOfAllBanks; i++) { - if ((gProtectStructs[gTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) + if ((gProtectStructs[gBanksByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) { - PressurePPLose(gBankAttacker, gTurnOrder[i], MOVE_SNATCH); - gProtectStructs[gTurnOrder[i]].stealMove = 0; - BATTLE_STRUCT->scriptingActive = gTurnOrder[i]; + PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH); + gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0; + BATTLE_STRUCT->scriptingActive = gBanksByTurnOrder[i]; b_movescr_stack_push_cursor(); gBattlescriptCurrInstr = BattleScript_SnatchedMove; return; @@ -2253,7 +2252,7 @@ u8 BankGetTurnOrder(u8 bank) int i; for (i = 0; i < gNoOfAllBanks; i++) { - if (gTurnOrder[i] == bank) + if (gBanksByTurnOrder[i] == bank) break; } return i; @@ -2527,7 +2526,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (gBattleMons[gEffectBank].status2 & STATUS2_UPROAR) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; + gLockedMoves[gEffectBank] = gCurrentMove; gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; b_movescr_stack_push(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; @@ -2551,7 +2550,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) break; case 12: //charging move gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; + gLockedMoves[gEffectBank] = gCurrentMove; gProtectStructs[gEffectBank].chargingTurn = 1; gBattlescriptCurrInstr++; break; @@ -2619,7 +2618,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) case 29: //recharge gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; gDisableStructs[gEffectBank].rechargeCounter = 2; - gLockedMove[gEffectBank] = gCurrentMove; + gLockedMoves[gEffectBank] = gCurrentMove; gBattlescriptCurrInstr++; break; case 30: //rage @@ -2711,7 +2710,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) { gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; + gLockedMoves[gEffectBank] = gCurrentMove; gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA); } else @@ -3909,7 +3908,7 @@ _0801ED7C:\n\ lsls r0, 5\n\ orrs r1, r0\n\ str r1, [r2]\n\ - ldr r1, _0801EDC8 @ =gLockedMove\n\ + ldr r1, _0801EDC8 @ =gLockedMoves\n\ ldrb r0, [r3]\n\ lsls r0, 1\n\ adds r0, r1\n\ @@ -3941,7 +3940,7 @@ _0801ED7C:\n\ ldr r0, [r0]\n\ bl _0801F5F8\n\ .align 2, 0\n\ -_0801EDC8: .4byte gLockedMove\n\ +_0801EDC8: .4byte gLockedMoves\n\ _0801EDCC: .4byte gCurrentMove\n\ _0801EDD0: .4byte gBattlescriptCurrInstr\n\ _0801EDD4: .4byte gMoveEffectBS_Ptrs\n\ @@ -4035,7 +4034,7 @@ _0801EE84:\n\ lsls r1, 5\n\ orrs r0, r1\n\ str r0, [r2]\n\ - ldr r1, _0801EEC0 @ =gLockedMove\n\ + ldr r1, _0801EEC0 @ =gLockedMoves\n\ mov r2, r8\n\ ldrb r0, [r2]\n\ lsls r0, 1\n\ @@ -4053,7 +4052,7 @@ _0801EE84:\n\ strb r0, [r1, 0x1]\n\ b _0801F5DC\n\ .align 2, 0\n\ -_0801EEC0: .4byte gLockedMove\n\ +_0801EEC0: .4byte gLockedMoves\n\ _0801EEC4: .4byte gCurrentMove\n\ _0801EEC8: .4byte gProtectStructs\n\ _0801EECC:\n\ @@ -4365,7 +4364,7 @@ _0801F13C:\n\ adds r0, r2\n\ movs r1, 0x2\n\ strb r1, [r0, 0x19]\n\ - ldr r1, _0801F17C @ =gLockedMove\n\ + ldr r1, _0801F17C @ =gLockedMoves\n\ ldrb r0, [r3]\n\ lsls r0, 1\n\ adds r0, r1\n\ @@ -4375,7 +4374,7 @@ _0801F13C:\n\ b _0801F5DC\n\ .align 2, 0\n\ _0801F178: .4byte gDisableStructs\n\ -_0801F17C: .4byte gLockedMove\n\ +_0801F17C: .4byte gLockedMoves\n\ _0801F180: .4byte gCurrentMove\n\ _0801F184:\n\ ldr r0, _0801F1A0 @ =gBankAttacker\n\ @@ -4764,7 +4763,7 @@ _0801F4C4:\n\ lsls r0, 5\n\ orrs r1, r0\n\ str r1, [r2]\n\ - ldr r1, _0801F4F8 @ =gLockedMove\n\ + ldr r1, _0801F4F8 @ =gLockedMoves\n\ ldrb r0, [r3]\n\ lsls r0, 1\n\ adds r0, r1\n\ @@ -4787,7 +4786,7 @@ _0801F4F2:\n\ str r0, [r2]\n\ b _0801F5FA\n\ .align 2, 0\n\ -_0801F4F8: .4byte gLockedMove\n\ +_0801F4F8: .4byte gLockedMoves\n\ _0801F4FC: .4byte gCurrentMove\n\ _0801F500:\n\ mov r5, r8\n\ @@ -10660,8 +10659,8 @@ static void atk52_switchineffects(void) for (i = 0; i < gNoOfAllBanks; i++) { - if (gTurnOrder[i] == gActiveBank) - gUnknown_02024A76[i] = 0xC; + if (gBanksByTurnOrder[i] == gActiveBank) + gActionsByTurnOrder[i] = 0xC; } for (i = 0; i < gNoOfAllBanks; i++) @@ -10838,7 +10837,7 @@ static void atk5A_yesnoboxlearnmove(void) } break; case 3: - if (!gPaletteFade.active && gMain.callback2 == sub_800F808) + if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2) { u8 move_pos = sub_809FA30(); if (move_pos == 4) @@ -11404,7 +11403,7 @@ static void atk68_cancelallactions(void) int i; for (i = 0; i < gNoOfAllBanks; i++) { - gUnknown_02024A76[i] = 0xC; + gActionsByTurnOrder[i] = 0xC; } gBattlescriptCurrInstr++; } @@ -11943,7 +11942,7 @@ static void atk71_buffermovetolearn(void) static void atk72_jumpifplayerran(void) { - if (sub_8014AB8(gBank1)) + if (TryRunFromBattle(gBank1)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; @@ -13251,7 +13250,7 @@ static void atk8A_normalisebuffs(void) //haze static void atk8B_setbide(void) { gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gBankAttacker] = gCurrentMove; + gLockedMoves[gBankAttacker] = gCurrentMove; gTakenDmg[gBankAttacker] = 0; gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); //2 turns gBattlescriptCurrInstr++; @@ -15075,7 +15074,7 @@ static void atkB3_rolloutdamagecalculation(void) gDisableStructs[gBankAttacker].rolloutTimer1 = 5; gDisableStructs[gBankAttacker].rolloutTimer2 = 5; gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gBankAttacker] = gCurrentMove; + gLockedMoves[gBankAttacker] = gCurrentMove; } if (--gDisableStructs[gBankAttacker].rolloutTimer1 == 0) gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); @@ -15252,8 +15251,8 @@ static void atkBA_jumpifnopursuitswitchdmg(void) int i; for (i = 0; i < gNoOfAllBanks; i++) { - if (gTurnOrder[i] == gBankTarget) - gUnknown_02024A76[i] = 11; + if (gBanksByTurnOrder[i] == gBankTarget) + gActionsByTurnOrder[i] = 11; } gCurrentMove = MOVE_PURSUIT; gBattlescriptCurrInstr += 5; @@ -17014,7 +17013,7 @@ static void atkEC_pursuitrelated(void) gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank]) && gActionForBanks[gActiveBank] == 0 && gChosenMovesByBanks[gActiveBank] == MOVE_PURSUIT) { - gUnknown_02024A76[gActiveBank] = 11; + gActionsByTurnOrder[gActiveBank] = 11; gCurrentMove = MOVE_PURSUIT; gBattlescriptCurrInstr += 5; BATTLE_STRUCT->animTurn = 1; @@ -17230,7 +17229,7 @@ static void atkF2_displaydexinfo(void) } break; case 2: - if (!gPaletteFade.active && gMain.callback2 == sub_800F808 && !gTasks[gBattleCommunication[1]].isActive) + if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2 && !gTasks[gBattleCommunication[1]].isActive) { LZDecompressVram(gBattleTerrainTiles_Building, (void*)(0x06008000)); LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(0x0600d000)); @@ -17394,12 +17393,12 @@ static void atkF3_trygivecaughtmonnick(void) if (!gPaletteFade.active) { GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); - DoNamingScreen(2, BATTLE_STRUCT->caughtNick, GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), sub_800F808); + DoNamingScreen(2, BATTLE_STRUCT->caughtNick, GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), BattleMainCB2); gBattleCommunication[0]++; } break; case 3: - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active ) + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active ) { SetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c index 35d8f33c8..54181bc21 100644 --- a/src/battle/battle_controller_linkopponent.c +++ b/src/battle/battle_controller_linkopponent.c @@ -48,8 +48,8 @@ extern u8 gUnknown_02024E68[]; extern struct SpriteTemplate gUnknown_02024E8C; extern u8 gAnimMoveTurn; extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u8 gUnknown_0300434C[]; extern u32 gBattleExecBuffer; extern MainCallback gPreBattleCallback1; @@ -1410,8 +1410,8 @@ void sub_8039B64(void) void LinkOpponentHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gBattleBankFunc[gActiveBank] = sub_8037C2C; diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c index adc3c1c85..2c78d4a82 100644 --- a/src/battle/battle_controller_linkpartner.c +++ b/src/battle/battle_controller_linkpartner.c @@ -48,8 +48,8 @@ extern u8 gAnimFriendship; extern u16 gWeatherMoveAnim; extern u8 gAnimMoveTurn; extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern MainCallback gPreBattleCallback1; extern void (*gBattleBankFunc[])(void); extern u8 gHealthboxIDs[]; @@ -1355,8 +1355,8 @@ void sub_811FF30(void) void LinkPartnerHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gBattleBankFunc[gActiveBank] = sub_811DFA0; diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index 477b600ac..ab7b6944b 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -50,8 +50,8 @@ extern u8 gAnimMoveTurn; extern u8 gAnimScriptActive; extern void (*gAnimScriptCallback)(void); extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u8 gDisplayedStringBattle[]; extern u8 gBankTarget; extern u8 gAbsentBankFlags; @@ -1404,8 +1404,8 @@ void sub_8035238(void) void OpponentHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gBattleBankFunc[gActiveBank] = sub_80331D0; diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 62a38311a..f992e3e51 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -35,8 +35,8 @@ struct MovePpInfo #define SUB_803037C_TILE_DATA_OFFSET 444 #endif -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042A0; +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG0_Y; extern struct Window gUnknown_03004210; @@ -72,7 +72,7 @@ extern u16 gBattle_BG1_Y; extern u16 gUnknown_030041B8; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u8 gUnknown_03004344; extern u8 gUnknown_0300434C[]; @@ -148,8 +148,8 @@ extern u8 gAbsentBankFlags; extern u8 gUnknown_03004344; extern u8 gNoOfAllBanks; extern u16 gBattlePartyID[]; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern struct Window gUnknown_03004210; extern const u8 BattleText_SwitchWhich[]; extern u8 gUnknown_03004348; @@ -679,8 +679,8 @@ void sub_802C68C(void) { DestroyMenuCursor(); PlaySE(SE_SELECT); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 320; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 320; Emitcmd33(1, 10, 0xFFFF); PlayerBufferExecCompleted(); } @@ -1495,7 +1495,7 @@ void sub_802DF30(void) void sub_802DF88(void) { - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active) + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gUnknown_0202E8F4 == 1) Emitcmd34(1, gUnknown_0202E8F5, gUnknown_02038470); @@ -1519,7 +1519,7 @@ void sub_802E004(void) void sub_802E03C(void) { - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active) + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { Emitcmd35(1, gSpecialVar_ItemId); PlayerBufferExecCompleted(); @@ -1695,8 +1695,8 @@ void b_link_standby_message(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; sub_8002EB0(&gUnknown_03004210, BattleText_LinkStandby, 0x90, 2, 15); } } @@ -2559,8 +2559,8 @@ void sub_8030190(void) void PlayerHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); gBattleBankFunc[gActiveBank] = sub_802DF18; @@ -2578,8 +2578,8 @@ void PlayerHandlecmd18(void) { int r4; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 160; FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18); FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); @@ -2612,8 +2612,8 @@ void PlayerHandlecmd20(void) void sub_80304A8(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 320; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 320; sub_802E1B0(); gUnknown_03004344 = 0xFF; sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0); diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c index 37c58f951..0a629ba4d 100644 --- a/src/battle/battle_controller_safari.c +++ b/src/battle/battle_controller_safari.c @@ -23,8 +23,8 @@ extern u8 gActiveBank; extern const u8 BattleText_MenuOptionsSafari[]; extern void *gBattleBankFunc[]; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u8 gBattleBufferA[][0x200]; extern bool8 gDoingBattleAnim; extern u8 gObjectBankIDs[]; @@ -313,7 +313,7 @@ void sub_812B724(void) void sub_812B758(void) { - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active) + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { Emitcmd35(1, gSpecialVar_ItemId); SafariBufferExecCompleted(); @@ -450,8 +450,8 @@ void SafariHandleMoveAnimation(void) void SafariHandlePrintString(void) { - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); gBattleBankFunc[gActiveBank] = sub_812B694; @@ -469,8 +469,8 @@ void SafariHandlecmd18(void) { int i; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 160; gUnknown_03004210.paletteNum = 0; FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c index be40f968c..bd2b4a45b 100644 --- a/src/battle/battle_controller_wally.c +++ b/src/battle/battle_controller_wally.c @@ -53,8 +53,8 @@ extern u8 gUnknown_02024E68[]; extern struct SpriteTemplate gUnknown_02024E8C; extern u8 gAnimMoveTurn; extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u8 gUnknown_0300434C[]; extern const u8 BattleText_WallyMenu[]; extern const u8 BattleText_MenuOptions[]; @@ -363,7 +363,7 @@ void sub_81374C4(void) void sub_81374FC(void) { - if (gMain.callback2 == sub_800F808 + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { Emitcmd35(1, gSpecialVar_ItemId); @@ -1240,8 +1240,8 @@ void WallyHandlePrintString(void) { u16 *ptr; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; ptr = (u16 *)&gBattleBufferA[gActiveBank][2]; if (*ptr == 2) DestroyMenuCursor(); @@ -1262,8 +1262,8 @@ void WallyHandlecmd18(void) { s32 i; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 160; gUnknown_03004210.paletteNum = 0; FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c index a7646e78b..6a6d7a137 100644 --- a/src/battle/reshow_battle_screen.c +++ b/src/battle/reshow_battle_screen.c @@ -13,12 +13,12 @@ extern struct SpriteTemplate gUnknown_02024E8C; extern struct Window gUnknown_03004210; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u16 gUnknown_030041B0; extern u16 gBattle_BG1_Y; extern u16 gUnknown_030041B8; -extern u16 gUnknown_030042A0; +extern u16 gBattle_BG0_Y; extern u8 gReservedSpritePaletteCount; extern u8 gActionSelectionCursor[4]; extern u8 gBankInMenu; @@ -81,8 +81,8 @@ static void CB2_ReshowBattleScreenAfterMenu(void) SetUpWindowConfig(&gWindowConfig_81E6C58); ResetPaletteFade(); InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; @@ -190,7 +190,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void) sub_807B06C(); BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1); gPaletteFade.bufferTransferDisabled = 0; - SetMainCallback2(sub_800F808); + SetMainCallback2(BattleMainCB2); break; } gReshowState++; diff --git a/src/contest.c b/src/contest.c index 365f92538..c32719648 100644 --- a/src/contest.c +++ b/src/contest.c @@ -60,8 +60,8 @@ extern u16 gBattle_WIN0V; extern u16 gBattle_WIN1V; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u16 gBattle_WIN0H; extern u32 gUnknown_03005D28; // saved RNG value @@ -324,8 +324,8 @@ void ResetContestGpuRegs(void) REG_WINOUT = 0x3F3F; REG_DISPCNT |= 0x7F00; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; @@ -620,8 +620,8 @@ void ContestMainCallback2(void) void ContestVBlankCallback(void) { - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; @@ -640,7 +640,7 @@ void ContestVBlankCallback(void) void sub_80ABB70(u8 taskId) { - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; sub_80B0D7C(); DmaCopy32Defvars(3, gPlttBufferUnfaded, shared18000.unk18204, 0x400); @@ -684,7 +684,7 @@ void sub_80ABCDC(u8 taskId) u8 i; u8 sp8[32]; - gUnknown_030042A0 = 0xA0; + gBattle_BG0_Y = 0xA0; gBattle_BG2_Y = 0xA0; FillWindowRect_DefaultPalette( &gUnknown_03004210, @@ -772,7 +772,7 @@ void sub_80ABEA0(u8 taskId) sub_80AF138(); StringExpandPlaceholders(gStringVar4, gDisplayedStringBattle); sub_8003460(&gMenuWindow, gStringVar4, 776, 1, 15); - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; gTasks[taskId].func = sub_80ABC70; break; @@ -846,7 +846,7 @@ void sub_80AC15C(u8 taskId) void sub_80AC188(u8 taskId) { sub_80AF138(); - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; sub_80AFFE0(FALSE); DmaCopy32Defvars(3, gPlttBufferFaded, shared18000.unk18604, 0x400); @@ -1804,7 +1804,7 @@ void sub_80ADDA4(u8 taskId) { s32 i; - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; for (i = 0; i < 4; i++) gUnknown_02038680[i] = sContestantStatus[i].unk4; @@ -2950,7 +2950,7 @@ bool8 sub_80AF828(s32 a, s32 b, struct UnknownContestStruct6 *c) void sub_80AF860(void) { - gUnknown_030042A0 = 0; + gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; sub_80AF138(); sub_8003460(&gMenuWindow, gUnknownText_LinkStandbyAndWinner, 776, 1, 15); diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c index bb80de6fe..49fe6864b 100644 --- a/src/debug/matsuda_debug_menu.c +++ b/src/debug/matsuda_debug_menu.c @@ -29,8 +29,8 @@ extern u8 gContestPlayerMonIndex; extern u16 gSpecialVar_ContestCategory; extern u16 gSpecialVar_ContestRank; -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042A0; +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG0_Y; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; @@ -457,8 +457,8 @@ static void sub_80A9F50(void) REG_BLDY = 0; REG_BG0HOFS = 0; REG_BG0VOFS = 0; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; @@ -505,8 +505,8 @@ static void sub_80AA064(void) static void sub_80AA090(void) { - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; diff --git a/src/field/tv.c b/src/field/tv.c index d7a75a709..e88e3c72b 100644 --- a/src/field/tv.c +++ b/src/field/tv.c @@ -811,7 +811,7 @@ u8 sub_80BDEAC(u8 *a0) return lang; } -void sub_80BDEC8(void) +void PutPokemonTodayCaughtOnAir(void) { u8 i; u16 total; diff --git a/src/scene/evolution_scene.c b/src/scene/evolution_scene.c index f307f5979..4ee601360 100644 --- a/src/scene/evolution_scene.c +++ b/src/scene/evolution_scene.c @@ -65,8 +65,8 @@ void nullsub_6(void); bool32 IsHMMove2(u16 move); extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042A0; +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG0_Y; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; @@ -200,8 +200,8 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, SetUpWindowConfig(&gWindowConfig_81E6C58); ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; @@ -308,8 +308,8 @@ static void CB2_EvolutionSceneLoadGraphics(void) REG_WINOUT = 0; SetUpWindowConfig(&gWindowConfig_81E6C58); ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; @@ -362,8 +362,8 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; @@ -3923,8 +3923,8 @@ static void EvoDummyFunc(void) static void VBlankCB_EvolutionScene(void) { REG_BG0CNT = BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256 | BGCNT_AFF512x512 | BGCNT_PRIORITY(3); // 0x9803 - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; @@ -3939,8 +3939,8 @@ static void VBlankCB_EvolutionScene(void) static void VBlankCB_TradeEvolutionScene(void) { - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; REG_BG2HOFS = gBattle_BG2_X; diff --git a/src/unknown_task.c b/src/unknown_task.c index 62245502a..2c71bfb08 100644 --- a/src/unknown_task.c +++ b/src/unknown_task.c @@ -12,8 +12,8 @@ extern u16 gBattle_BG1_Y; extern u16 gUnknown_030041B8; extern u16 gBattle_BG2_Y; extern u16 gBattle_BG2_X; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u8 gUnknown_0202FFA4; @@ -120,10 +120,10 @@ static void task00_for_dp12(u8 taskId) switch (gTasks[taskId].data[6]) { case 0x0: - value = gUnknown_030042A4; + value = gBattle_BG0_X; break; case 0x2: - value = gUnknown_030042A0; + value = gBattle_BG0_Y; break; case 0x4: value = gBattle_BG1_X; -- cgit v1.2.3 From be36c506387648a11afe51b0f4209386947feb37 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 7 Jan 2018 17:57:46 -0800 Subject: Finish battle_2.c and battle_util.c decompilation --- src/battle/battle_2.c | 16 +- src/battle/battle_3.c | 3229 --------------------------- src/battle/battle_4.c | 258 ++- src/battle/battle_util.c | 3479 ++++++++++++++++++++++++++++++ src/data/pokemon/trainer_class_lookups.h | 10 +- src/pokemon/pokemon_2.c | 1 + src/rom3.c | 3 +- 7 files changed, 3619 insertions(+), 3377 deletions(-) delete mode 100644 src/battle/battle_3.c create mode 100644 src/battle/battle_util.c (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index a30245081..ae84e5585 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -5,6 +5,7 @@ #include "battle_interface.h" #include "battle_message.h" #include "battle_setup.h" +#include "battle_util.h" #include "data2.h" #include "event_data.h" #include "evolution_scene.h" @@ -141,7 +142,7 @@ extern u16 gBattleWeather; extern u32 gBattleMoveDamage; extern struct BattlePokemon gBattleMons[]; extern u8 gBattleMoveFlags; -extern const u8 BattleScript_FocusPunchSetUp[]; +extern u8 BattleScript_FocusPunchSetUp[]; extern u16 gDynamicBasePower; extern u8 gCurrentTurnActionNumber; extern void (* const gUnknown_081FA640[])(void); @@ -175,7 +176,6 @@ extern u8 gUnknown_081FA70C[][3]; extern u8 gUnknown_081FA71B[]; extern u8 gUnknown_081FA71F[]; -void b_call_bc_move_exec(const u8* BS_ptr); static void BattlePrepIntroSlide(void); void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); @@ -2180,7 +2180,7 @@ void BattleBeginFirstTurn(void) SpecialStatusesClear(); ewram160A6 = gAbsentBankFlags; gBattleMainFunc = sub_8012324; - sub_80156DC(); + ResetSentPokesToOpponentValue(); for (i = 0; i < 8; i++) gBattleCommunication[i] = 0; for (i = 0; i < gNoOfAllBanks; i++) @@ -2236,7 +2236,7 @@ void BattleTurnPassed(void) if (HandleFaintedMonActions() != 0) return; ewram16059 = 0; - if (sub_80170DC() != 0) + if (HandleWishPerishSongOnTurnEnd() != 0) return; TurnValuesCleanUp(0); gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; @@ -3154,7 +3154,7 @@ _08012968:\n\ cmp r0, 0x3\n\ bne _080129A8\n\ ldr r0, _080129A0 @ =BattleScript_PrintCantRunFromTrainer\n\ - bl b_call_bc_move_exec\n\ + bl BattleScriptExecute\n\ ldr r1, _080129A4 @ =gBattleCommunication\n\ ldrb r0, [r4]\n\ adds r0, r1\n\ @@ -3318,7 +3318,7 @@ _08012ACC:\n\ _08012AF4: .4byte 0x0000ffff\n\ _08012AF8: .4byte gBattleCommunication\n\ _08012AFC:\n\ - bl sub_8015894\n\ + bl TrySetCantSelectMoveBattleScript\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _08012B48\n\ @@ -4207,13 +4207,13 @@ void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) && !(gDisableStructs[gBankAttacker].truantCounter) && !(gProtectStructs[gActiveBank].onlyStruggle)) { - b_call_bc_move_exec(BattleScript_FocusPunchSetUp); + BattleScriptExecute(BattleScript_FocusPunchSetUp); return; } } } - b_clear_atk_up_if_hit_flag_unless_enraged(); + TryClearRageStatuses(); gCurrentTurnActionNumber = 0; { // something stupid needed to match diff --git a/src/battle/battle_3.c b/src/battle/battle_3.c deleted file mode 100644 index 92e0404cc..000000000 --- a/src/battle/battle_3.c +++ /dev/null @@ -1,3229 +0,0 @@ -#include "global.h" -#include "constants/abilities.h" -#include "battle.h" -#include "constants/moves.h" -#include "item.h" -#include "constants/items.h" -#include "event_data.h" -#include "constants/hold_effects.h" -#include "constants/species.h" -#include "constants/weather.h" -#include "pokemon.h" -#include "data2.h" -#include "random.h" -#include "text.h" -#include "constants/battle_move_effects.h" -#include "string_util.h" -#include "constants/flags.h" -#include "ewram.h" - -extern u8* gBattlescriptCurrInstr; -extern u8 gActiveBank; -extern u8 gBattleBufferB[4][0x200]; -extern u8* gUnknown_02024C1C[4]; //battlescript location when you try to choose a move you're not allowed to -extern u16 gLastUsedMove[4]; -extern struct BattlePokemon gBattleMons[4]; -extern struct BattleEnigmaBerry gEnigmaBerries[4]; -extern u8 gStringBank; -extern u16 gLastUsedItem; -extern u16 gCurrentMove; -extern const u32 gBitTable[]; -extern u16 gBattleTypeFlags; -extern u8 gNoOfAllBanks; -extern u32 gStatuses3[4]; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gBanksByTurnOrder[4]; -extern u16 gSideAffecting[2]; -extern u16 gBattleWeather; -extern void (*gBattleMainFunc)(void); -extern u8 gAbsentBankFlags; -extern u8 gBattleCommunication[]; -extern u32 gHitMarker; -extern u8 gEffectBank; -extern u8 gBank1; -extern s32 gBattleMoveDamage; -extern u16 gBattlePartyID[4]; -extern u16 gChosenMovesByBanks[4]; -extern s32 gTakenDmg[4]; -extern u8 gTakenDmgBanks[4]; -extern u8 gBattleMoveFlags; -extern u8 gLastUsedAbility; -extern u8 gBattleTextBuff2[]; -extern u8 gCurrentActionFuncId; -extern struct BattleEnigmaBerry gEnigmaBerries[4]; -extern u8 gUnknown_02024BE5; -extern u8 gCurrMovePos; -extern u16 gRandomMove; -extern s32 gBattleMoveDamage; -extern u16 gDynamicBasePower; -extern u32 gBattleExecBuffer; -extern const u16 gSoundMovesTable[]; -extern const u8 gStatusConditionString_PoisonJpn[]; -extern const u8 gStatusConditionString_SleepJpn[]; -extern const u8 gStatusConditionString_ParalysisJpn[]; -extern const u8 gStatusConditionString_BurnJpn[]; -extern const u8 gStatusConditionString_IceJpn[]; -extern const u8 gStatusConditionString_ConfusionJpn[]; -extern const u8 gStatusConditionString_LoveJpn[]; -extern const BattleCmdFunc gBattleScriptingCommandsTable[]; - -u8 IsImprisoned(u8 bank, u16 move); -u8 GetBankByIdentity(u8 ID); -u8 GetBankIdentity(u8 bank); -u8 GetBankSide(u8 bank); -void b_call_bc_move_exec(u8* BS_ptr); -bool8 sub_8015660(u8 bank); //check if a move failed -void SetMoveEffect(bool8 primary, u8 certainArg); -bool8 UproarWakeUpCheck(u8 bank); -bool8 sub_8018018(u8 bank, u8, u8); -void sub_8015740(u8 bank); -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); -u8 CountTrailingZeroBits(u32 a); -u8 GetMoveTarget(u16 move, u8 useMoveTarget); -u8 sub_803FC34(u8 bank); -u16 sub_803FBFC(u8 a); -u8 weather_get_current(void); -void b_push_move_exec(u8* BS_ptr); -void RecordAbilityBattle(u8 bank, u8 ability); -void RecordItemBattle(u8 bank, u8 holdEffect); -s8 GetPokeFlavourRelation(u32 pid, u8 flavor); - -extern u8 BattleScript_MoveSelectionDisabledMove[]; -extern u8 BattleScript_MoveSelectionTormented[]; -extern u8 BattleScript_MoveSelectionTaunted[]; -extern u8 BattleScript_MoveSelectionImprisoned[]; -extern u8 BattleScript_MoveSelectionChoiceBanded[]; -extern u8 BattleScript_MoveSelectionNoPP[]; -extern u8 BattleScript_NoMovesLeft[]; -extern u8 BattleScript_WishComesTrue[]; -extern u8 BattleScript_IngrainTurnHeal[]; -extern u8 BattleScript_LeechSeedTurnDrain[]; -extern u8 BattleScript_PoisonTurnDmg[]; -extern u8 BattleScript_BurnTurnDmg[]; -extern u8 BattleScript_NightmareTurnDmg[]; -extern u8 BattleScript_CurseTurnDmg[]; -extern u8 BattleScript_WrapTurnDmg[]; -extern u8 BattleScript_WrapEnds[]; -extern u8 BattleScript_DisabledNoMore[]; -extern u8 BattleScript_EncoredNoMore[]; - -extern u8 BattleScript_SideStatusWoreOff[]; -extern u8 BattleScript_RainContinuesOrEnds[]; -extern u8 BattleScript_SandStormHailEnds[]; -extern u8 BattleScript_DamagingWeatherContinues[]; -extern u8 BattleScript_SunlightFaded[]; -extern u8 BattleScript_SunlightContinues[]; -extern u8 BattleScript_SafeguardEnds[]; -extern u8 BattleScript_MonWokeUpInUproar[]; //uproar wakeup BS -extern u8 BattleScript_PrintUproarOverTurns[]; //uproar BS -extern u8 BattleScript_ThrashConfuses[]; -extern u8 BattleScript_YawnMakesAsleep[]; -extern u8 BattleScript_MonTookFutureAttack[]; -extern u8 BattleScript_PerishSongHits[]; -extern u8 BattleScript_PerishSongTimerGoesDown[]; -extern u8 BattleScript_GiveExp[]; -extern u8 BattleScript_HandleFaintedMon[]; - -extern u8 BattleScript_MoveUsedIsAsleep[]; -extern u8 BattleScript_MoveUsedWokeUp[]; -extern u8 BattleScript_MoveUsedIsFrozen[]; -extern u8 BattleScript_MoveUsedUnfroze[]; -extern u8 BattleScript_MoveUsedLoafingAround[]; -extern u8 BattleScript_MoveUsedMustRecharge[]; -extern u8 BattleScript_MoveUsedFlinched[]; -extern u8 BattleScript_MoveUsedIsDisabled[]; -extern u8 BattleScript_MoveUsedIsTaunted[]; -extern u8 BattleScript_MoveUsedIsImprisoned[]; -extern u8 BattleScript_MoveUsedIsConfused[]; -extern u8 BattleScript_MoveUsedIsConfusedNoMore[]; -extern u8 BattleScript_MoveUsedIsParalyzed[]; -extern u8 BattleScript_MoveUsedIsParalyzedCantAttack[]; -extern u8 BattleScript_MoveUsedIsInLove[]; -extern u8 BattleScript_BideStoringEnergy[]; -extern u8 BattleScript_BideAttack[]; -extern u8 BattleScript_BideNoEnergyToAttack[]; - -extern u8 BattleScript_OverworldWeatherStarts[]; //load weather from overworld -extern u8 BattleScript_DrizzleActivates[]; -extern u8 BattleScript_SandstreamActivates[]; -extern u8 BattleScript_DroughtActivates[]; -extern u8 BattleScript_CastformChange[]; -extern u8 BattleScript_RainDishActivates[]; -extern u8 BattleScript_ShedSkinActivates[]; -extern u8 BattleScript_SpeedBoostActivates[]; -extern u8 BattleScript_SoundproofProtected[]; -extern u8 BattleScript_MoveHPDrain[]; -extern u8 BattleScript_MoveHPDrain_PPLoss[]; -extern u8 BattleScript_FlashFireBoost[]; -extern u8 BattleScript_FlashFireBoost_PPLoss[]; -extern u8 BattleScript_MoveHPDrain_FullHP[]; -extern u8 BattleScript_MoveHPDrain_FullHP_PPLoss[]; -extern u8 BattleScript_ColorChangeActivates[]; -extern u8 BattleScript_RoughSkinActivates[]; -extern u8 BattleScript_ApplySecondaryEffect[]; -extern u8 BattleScript_CuteCharmActivates[]; -extern u8 BattleScript_AbilityCuredStatus[]; //ability status clear -extern u8 BattleScript_SynchronizeActivates[]; -extern u8 gUnknown_081D978C[]; //intimidate1 -extern u8 gUnknown_081D9795[]; //intimidate2 -extern u8 BattleScript_TraceActivates[]; - -extern u8 BattleScript_WhiteHerbEnd2[]; -extern u8 BattleScript_WhiteHerbRet[]; -extern u8 BattleScript_ItemHealHP_RemoveItem[]; -extern u8 BattleScript_BerryPPHealEnd2[]; -extern u8 BattleScript_ItemHealHP_End2[]; -extern u8 BattleScript_BerryConfuseHealEnd2[]; -extern u8 BattleScript_BerryStatRaiseEnd2[]; -extern u8 BattleScript_BerryFocusEnergyEnd2[]; -extern u8 BattleScript_BerryCurePrlzEnd2[]; -extern u8 BattleScript_BerryCurePsnEnd2[]; -extern u8 BattleScript_BerryCureBrnEnd2[]; -extern u8 BattleScript_BerryCureFrzEnd2[]; -extern u8 BattleScript_BerryCureSlpEnd2[]; -extern u8 BattleScript_BerryCureConfusionEnd2[]; -extern u8 BattleScript_BerryCureChosenStatusEnd2[]; //berry cure any status end2 -extern u8 BattleScript_BerryCureParRet[]; -extern u8 BattleScript_BerryCurePsnRet[]; -extern u8 BattleScript_BerryCureBrnRet[]; -extern u8 BattleScript_BerryCureFrzRet[]; -extern u8 BattleScript_BerryCureSlpRet[]; -extern u8 BattleScript_BerryCureConfusionRet[]; -extern u8 BattleScript_BerryCureChosenStatusRet[]; //berry cure any status return - -extern u8 BattleScript_ItemHealHP_Ret[]; - -extern u8 gUnknown_081D995F[]; //disobedient while asleep -extern u8 BattleScript_IgnoresAndUsesRandomMove[]; //disobedient, uses a random move -extern u8 BattleScript_IgnoresAndFallsAsleep[]; //disobedient, went to sleep -extern u8 gUnknown_081D99A0[]; //disobedient, hits itself - -//array entries for battle communication -#define MOVE_EFFECT_BYTE 0x3 -#define MULTISTRING_CHOOSER 0x5 -#define MSG_DISPLAY 0x7 - -void b_movescr_stack_push(u8* BS_ptr) -{ - B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = BS_ptr; -} - -void b_movescr_stack_push_cursor(void) -{ - B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = gBattlescriptCurrInstr; -} - -void b_movescr_stack_pop_cursor(void) -{ - gBattlescriptCurrInstr = B_BATTLESCRIPTS_STACK->ptr[--B_BATTLESCRIPTS_STACK->size]; -} - -u8 sub_8015894(void) //msg can't select a move -{ - u8 limitations = 0; - u16 move = gBattleMons[gActiveBank].moves[gBattleBufferB[gActiveBank][2]]; - u8 holdEffect; - u16* choicedMove = CHOICED_MOVE(gActiveBank); - if (gDisableStructs[gActiveBank].disabledMove == move && move) - { - BATTLE_STRUCT->scriptingActive = gActiveBank; - gCurrentMove = move; - gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionDisabledMove; - limitations++; - } - if (move == gLastUsedMove[gActiveBank] && move != MOVE_STRUGGLE && gBattleMons[gActiveBank].status2 & STATUS2_TORMENT) - { - CancelMultiTurnMoves(gActiveBank); - gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionTormented; - limitations++; - } - if (gDisableStructs[gActiveBank].tauntTimer1 && gBattleMoves[move].power == 0) - { - gCurrentMove = move; - gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionTaunted; - limitations++; - } - if (IsImprisoned(gActiveBank, move)) - { - gCurrentMove = move; - gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionImprisoned; - limitations++; - } - if (gBattleMons[gActiveBank].item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[gActiveBank].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBank].item); - gStringBank = gActiveBank; - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move) - { - gCurrentMove = *choicedMove; - gLastUsedItem = gBattleMons[gActiveBank].item; - gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionChoiceBanded; - limitations++; - } - if (gBattleMons[gActiveBank].pp[gBattleBufferB[gActiveBank][2]] == 0) - { - gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionNoPP; - limitations++; - } - return limitations; -} - -#define MOVE_LIMITATION_ZEROMOVE (1 << 0) -#define MOVE_LIMITATION_PP (1 << 1) -#define MOVE_LIMITATION_DISABLED (1 << 2) -#define MOVE_LIMITATION_TORMENTED (1 << 3) -#define MOVE_LIMITATION_TAUNT (1 << 4) -#define MOVE_LIMITATION_IMPRISION (1 << 5) - -u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check) -{ - u8 holdEffect; - u16* choicedMove = CHOICED_MOVE(bank); - s32 i; - if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[bank].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item); - gStringBank = bank; - for (i = 0; i < 4; i++) - { - if (gBattleMons[bank].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE) - unusableMoves |= gBitTable[i]; - if (gBattleMons[bank].pp[i] == 0 && check & MOVE_LIMITATION_PP) - unusableMoves |= gBitTable[i]; - if (gBattleMons[bank].moves[i] == gDisableStructs[bank].disabledMove && check & MOVE_LIMITATION_DISABLED) - unusableMoves |= gBitTable[i]; - if (gBattleMons[bank].moves[i] == gLastUsedMove[bank] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[bank].status2 & STATUS2_TORMENT) - unusableMoves |= gBitTable[i]; - if (gDisableStructs[bank].tauntTimer1 && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[bank].moves[i]].power == 0) - unusableMoves |= gBitTable[i]; - if (IsImprisoned(bank, gBattleMons[bank].moves[i]) && check & MOVE_LIMITATION_IMPRISION) - unusableMoves |= gBitTable[i]; - if (gDisableStructs[bank].encoreTimer1 && gDisableStructs[bank].encoredMove != gBattleMons[bank].moves[i]) - unusableMoves |= gBitTable[i]; - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[bank].moves[i]) - unusableMoves |= gBitTable[i]; - } - return unusableMoves; -} - -bool8 AreAllMovesUnusable(void) -{ - u8 unusable; - unusable = CheckMoveLimitations(gActiveBank, 0, 0xFF); - if (unusable == 0xF) //all moves are unusable - { - gProtectStructs[gActiveBank].onlyStruggle = 1; - gUnknown_02024C1C[gActiveBank] = BattleScript_NoMovesLeft; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - gBattleBufferB[gActiveBank][3] = GetBankByIdentity((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2)); - else - gBattleBufferB[gActiveBank][3] = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ 1); - } - else - gProtectStructs[gActiveBank].onlyStruggle = 0; - return (unusable == 0xF); -} - -u8 IsImprisoned(u8 bank, u16 move) -{ - u8 imprisionedMoves = 0; - u8 bankSide = GetBankSide(bank); - s32 i; - for (i = 0; i < gNoOfAllBanks; i++) - { - if (bankSide != GetBankSide(i) && gStatuses3[i] & STATUS3_IMPRISIONED) - { - s32 j; - for (j = 0; j < 4; j++) - { - if (move == gBattleMons[i].moves[j]) - break; - } - if (j < 4) - imprisionedMoves++; - } - } - return imprisionedMoves; -} - -u8 UpdateTurnCounters(void) -{ - u8 effect = 0; - s32 i; - - for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankAttacker]; gBankAttacker++) - { - } - for (gBankTarget = 0; gBankTarget < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankTarget]; gBankTarget++) - { - } - - do - { - u8 sideBank; - - switch (BATTLE_STRUCT->turncountersTracker) - { - case 0: - for (i = 0; i < gNoOfAllBanks; i++) - { - gBanksByTurnOrder[i] = i; - } - for (i = 0; i < gNoOfAllBanks - 1; i++) - { - s32 j; - for (j = i + 1; j < gNoOfAllBanks; j++) - { - if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 0)) - SwapTurnOrder(i, j); - } - } - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; - case 1: - while (BATTLE_STRUCT->turnSideTracker < 2) - { - gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; - - if (gSideAffecting[sideBank] & SIDE_STATUS_REFLECT) - { - if (--gSideTimers[sideBank].reflectTimer == 0) - { - - gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT; - b_call_bc_move_exec(BattleScript_SideStatusWoreOff); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = MOVE_REFLECT; - gBattleTextBuff1[3] = MOVE_REFLECT >> 8; - gBattleTextBuff1[4] = EOS; - effect++; - } - } - BATTLE_STRUCT->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; - } - break; - case 2: - while (BATTLE_STRUCT->turnSideTracker < 2) - { - gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; - if (gSideAffecting[sideBank] & SIDE_STATUS_LIGHTSCREEN) - { - if (--gSideTimers[sideBank].lightscreenTimer == 0) - { - gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN; - b_call_bc_move_exec(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = MOVE_LIGHT_SCREEN; - gBattleTextBuff1[3] = MOVE_LIGHT_SCREEN >> 8; - gBattleTextBuff1[4] = EOS; - effect++; - } - } - BATTLE_STRUCT->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; - } - break; - case 3: - while (BATTLE_STRUCT->turnSideTracker < 2) - { - gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; - if (gSideTimers[sideBank].mistTimer && --gSideTimers[sideBank].mistTimer == 0) - { - gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST; - b_call_bc_move_exec(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = MOVE_MIST; - gBattleTextBuff1[3] = MOVE_MIST >> 8; - gBattleTextBuff1[4] = EOS; - effect++; - } - BATTLE_STRUCT->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; - } - break; - case 4: - while (BATTLE_STRUCT->turnSideTracker < 2) - { - gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; - if (gSideAffecting[sideBank] & SIDE_STATUS_SAFEGUARD) - { - if (--gSideTimers[sideBank].safeguardTimer == 0) - { - gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD; - b_call_bc_move_exec(BattleScript_SafeguardEnds); - effect++; - } - } - BATTLE_STRUCT->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - BATTLE_STRUCT->turncountersTracker++; - BATTLE_STRUCT->turnSideTracker = 0; - } - break; - case 5: - while (BATTLE_STRUCT->turnSideTracker < gNoOfAllBanks) - { - gActiveBank = gBanksByTurnOrder[BATTLE_STRUCT->turnSideTracker]; - if (gWishFutureKnock.wishCounter[gActiveBank] && --gWishFutureKnock.wishCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp) - { - gBankTarget = gActiveBank; - b_call_bc_move_exec(BattleScript_WishComesTrue); - effect++; - } - BATTLE_STRUCT->turnSideTracker++; - if (effect) - break; - } - if (!effect) - { - BATTLE_STRUCT->turncountersTracker++; - } - break; - case 6: - if (gBattleWeather & WEATHER_RAIN_ANY) - { - if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) - { - if (--gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~WEATHER_RAIN_TEMPORARY; - gBattleWeather &= ~WEATHER_RAIN_DOWNPOUR; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - b_call_bc_move_exec(BattleScript_RainContinuesOrEnds); - effect++; - } - BATTLE_STRUCT->turncountersTracker++; - break; - case 7: - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - { - if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~WEATHER_SANDSTORM_TEMPORARY; - gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; - } - else - gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - - BATTLE_STRUCT->animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - b_call_bc_move_exec(gBattlescriptCurrInstr); - effect++; - } - BATTLE_STRUCT->turncountersTracker++; - break; - case 8: - if (gBattleWeather & WEATHER_SUN_ANY) - { - if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~WEATHER_SUN_TEMPORARY; - gBattlescriptCurrInstr = BattleScript_SunlightFaded; - } - else - gBattlescriptCurrInstr = BattleScript_SunlightContinues; - - b_call_bc_move_exec(gBattlescriptCurrInstr); - effect++; - } - BATTLE_STRUCT->turncountersTracker++; - break; - case 9: - if (gBattleWeather & WEATHER_HAIL) - { - if (--gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~WEATHER_HAIL; - gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; - } - else - gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - - BATTLE_STRUCT->animArg1 = B_ANIM_HAIL_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - b_call_bc_move_exec(gBattlescriptCurrInstr); - effect++; - } - BATTLE_STRUCT->turncountersTracker++; - break; - case 10: - effect++; - break; - } - } while (effect == 0); - return (gBattleMainFunc != BattleTurnPassed); -} - -#define TURNBASED_MAX_CASE 19 - -u8 TurnBasedEffects(void) -{ - u8 effect = 0; - - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - while (BATTLE_STRUCT->turnEffectsBank < gNoOfAllBanks && BATTLE_STRUCT->turnEffectsTracker <= TURNBASED_MAX_CASE) - { - gActiveBank = gBankAttacker = gBanksByTurnOrder[BATTLE_STRUCT->turnEffectsBank]; - if (gAbsentBankFlags & gBitTable[gActiveBank]) - { - BATTLE_STRUCT->turnEffectsBank++; - } - else - { - switch (BATTLE_STRUCT->turnEffectsTracker) - { - case 0: // ingrain - if ((gStatuses3[gActiveBank] & STATUS3_ROOTED) - && gBattleMons[gActiveBank].hp != gBattleMons[gActiveBank].maxHP - && gBattleMons[gActiveBank].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - b_call_bc_move_exec(BattleScript_IngrainTurnHeal); - effect++; - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 1: // end turn abilities - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBank, 0, 0, 0)) - effect++; - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 2: // item effects - if (ItemBattleEffects(1, gActiveBank, 0)) - effect++; - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 18: // item effects again - if (ItemBattleEffects(1, gActiveBank, 1)) - effect++; - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 3: // leech seed - if (gStatuses3[gActiveBank] & STATUS3_LEECHSEED && gBattleMons[gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK].hp != 0 && gBattleMons[gActiveBank].hp != 0) - { - gBankTarget = gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK; //funny how the 'target' is actually the bank that receives HP - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BATTLE_STRUCT->animArg1 = gBankTarget; - BATTLE_STRUCT->animArg2 = gBankAttacker; - b_call_bc_move_exec(BattleScript_LeechSeedTurnDrain); - effect++; - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 4: // poison - if ((gBattleMons[gActiveBank].status1 & STATUS_POISON) && gBattleMons[gActiveBank].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - b_call_bc_move_exec(BattleScript_PoisonTurnDmg); - effect++; - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 5: // toxic poison - if ((gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON) && gBattleMons[gActiveBank].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if ((gBattleMons[gActiveBank].status1 & 0xF00) != 0xF00) //not 16 turns - gBattleMons[gActiveBank].status1 += 0x100; - gBattleMoveDamage *= (gBattleMons[gActiveBank].status1 & 0xF00) >> 8; - b_call_bc_move_exec(BattleScript_PoisonTurnDmg); - effect++; - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 6: // burn - if ((gBattleMons[gActiveBank].status1 & STATUS_BURN) && gBattleMons[gActiveBank].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - b_call_bc_move_exec(BattleScript_BurnTurnDmg); - effect++; - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 7: // spooky nightmares - if ((gBattleMons[gActiveBank].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBank].hp != 0) - { - // missing sleep check - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - b_call_bc_move_exec(BattleScript_NightmareTurnDmg); - effect++; - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 8: // curse - if ((gBattleMons[gActiveBank].status2 & STATUS2_CURSED) && gBattleMons[gActiveBank].hp != 0) - { - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - b_call_bc_move_exec(BattleScript_CurseTurnDmg); - effect++; - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 9: // wrap - if ((gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBank].hp != 0) - { - gBattleMons[gActiveBank].status2 -= 0x2000; - if (gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) // damaged by wrap - { - BATTLE_STRUCT->animArg1 = ewram16004arr(0, gActiveBank); - BATTLE_STRUCT->animArg2 = ewram16004arr(1, gActiveBank); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = ewram16004arr(0, gActiveBank); - gBattleTextBuff1[3] = ewram16004arr(1, gActiveBank); - gBattleTextBuff1[4] = EOS; - gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else // broke free - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = ewram16004arr(0, gActiveBank); - gBattleTextBuff1[3] = ewram16004arr(1, gActiveBank); - gBattleTextBuff1[4] = EOS; - gBattlescriptCurrInstr = BattleScript_WrapEnds; - } - b_call_bc_move_exec(gBattlescriptCurrInstr); - effect++; - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 10: // uproar - if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR) - { - for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks; gBankAttacker++) - { - if ((gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) - && gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - b_call_bc_move_exec(BattleScript_MonWokeUpInUproar); - gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - break; - } - } - if (gBankAttacker != gNoOfAllBanks) - { - effect = 2; // a pokemon was awaken - break; - } - else - { - gBankAttacker = gActiveBank; - gBattleMons[gActiveBank].status2 -= 0x10; // uproar timer goes down - if (sub_8015660(gActiveBank)) - { - CancelMultiTurnMoves(gActiveBank); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleMons[gActiveBank].status2 |= STATUS2_MULTIPLETURNS; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - CancelMultiTurnMoves(gActiveBank); - } - b_call_bc_move_exec(BattleScript_PrintUproarOverTurns); - effect = 1; - } - } - if (effect != 2) - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 11: // thrash - if (gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE) - { - gBattleMons[gActiveBank].status2 -= 0x400; - if (sub_8015660(gActiveBank)) - CancelMultiTurnMoves(gActiveBank); - else if (!(gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE) - && (gBattleMons[gActiveBank].status2 & STATUS2_MULTIPLETURNS)) - { - gBattleMons[gActiveBank].status2 &= ~(STATUS2_MULTIPLETURNS); - if (!(gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x47; - SetMoveEffect(1, 0); - if (gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION) - b_call_bc_move_exec(BattleScript_ThrashConfuses); - effect++; - } - } - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 12: // disable - if (gDisableStructs[gActiveBank].disableTimer1 != 0) - { - int i; - for (i = 0; i < 4; i++) - { - if (gDisableStructs[gActiveBank].disabledMove == gBattleMons[gActiveBank].moves[i]) - break; - } - if (i == 4) // pokemon does not have the disabled move anymore - { - gDisableStructs[gActiveBank].disabledMove = 0; - gDisableStructs[gActiveBank].disableTimer1 = 0; - } - else if (--gDisableStructs[gActiveBank].disableTimer1 == 0) // disable ends - { - gDisableStructs[gActiveBank].disabledMove = 0; - b_call_bc_move_exec(BattleScript_DisabledNoMore); - effect++; - } - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 13: // encore - if (gDisableStructs[gActiveBank].encoreTimer1 != 0) - { - if (gBattleMons[gActiveBank].moves[gDisableStructs[gActiveBank].encoredMovePos] != gDisableStructs[gActiveBank].encoredMove) // pokemon does not have the encored move anymore - { - gDisableStructs[gActiveBank].encoredMove = 0; - gDisableStructs[gActiveBank].encoreTimer1 = 0; - } - else if (--gDisableStructs[gActiveBank].encoreTimer1 == 0 - || gBattleMons[gActiveBank].pp[gDisableStructs[gActiveBank].encoredMovePos] == 0) - { - gDisableStructs[gActiveBank].encoredMove = 0; - gDisableStructs[gActiveBank].encoreTimer1 = 0; - b_call_bc_move_exec(BattleScript_EncoredNoMore); - effect++; - } - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 14: // lock-on decrement - if (gStatuses3[gActiveBank] & STATUS3_ALWAYS_HITS) - gStatuses3[gActiveBank] -= 0x8; - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 15: // charge - if (gDisableStructs[gActiveBank].chargeTimer1 && --gDisableStructs[gActiveBank].chargeTimer1 == 0) - gStatuses3[gActiveBank] &= ~STATUS3_CHARGED_UP; - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 16: // taunt - if (gDisableStructs[gActiveBank].tauntTimer1) - gDisableStructs[gActiveBank].tauntTimer1--; - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 17: // yawn - if (gStatuses3[gActiveBank] & STATUS3_YAWN) - { - gStatuses3[gActiveBank] -= 0x800; - if (!(gStatuses3[gActiveBank] & STATUS3_YAWN) && !(gBattleMons[gActiveBank].status1 & STATUS_ANY) - && gBattleMons[gActiveBank].ability != ABILITY_VITAL_SPIRIT - && gBattleMons[gActiveBank].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBank)) - { - CancelMultiTurnMoves(gActiveBank); - gBattleMons[gActiveBank].status1 |= (Random() & 3) + 2; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - gEffectBank = gActiveBank; - b_call_bc_move_exec(BattleScript_YawnMakesAsleep); - effect++; - } - } - BATTLE_STRUCT->turnEffectsTracker++; - break; - case 19: // done - BATTLE_STRUCT->turnEffectsTracker = 0; - BATTLE_STRUCT->turnEffectsBank++; - break; - } - if (effect != 0) - return effect; - } - } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); - return 0; -} - -bool8 sub_80170DC(void) // handle future sight and perish song -{ - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - switch (BATTLE_STRUCT->sub80170DC_Tracker) - { - case 0: // future sight - while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks) - { - gActiveBank = BATTLE_STRUCT->sub80170DC_Bank; - if (gAbsentBankFlags & gBitTable[gActiveBank]) - BATTLE_STRUCT->sub80170DC_Bank++; - else - { - BATTLE_STRUCT->sub80170DC_Bank++; - if (gWishFutureKnock.futureSightCounter[gActiveBank] && --gWishFutureKnock.futureSightCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp) - { - if (gWishFutureKnock.futureSightMove[gActiveBank] == MOVE_FUTURE_SIGHT) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else //Doom Desire - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gWishFutureKnock.futureSightMove[gActiveBank]; - gBattleTextBuff1[3] = gWishFutureKnock.futureSightMove[gActiveBank] >> 8; - gBattleTextBuff1[4] = 0xFF; - gBankTarget = gActiveBank; - gBankAttacker = gWishFutureKnock.futureSightAttacker[gActiveBank]; - gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBank]; - gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; - b_call_bc_move_exec(BattleScript_MonTookFutureAttack); - return 1; - } - } - } - BATTLE_STRUCT->sub80170DC_Tracker = 1; - BATTLE_STRUCT->sub80170DC_Bank = 0; - case 1: // perish song - while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks) - { - gActiveBank = gBankAttacker = gBanksByTurnOrder[BATTLE_STRUCT->sub80170DC_Bank]; - if (gAbsentBankFlags & gBitTable[gActiveBank]) - BATTLE_STRUCT->sub80170DC_Bank++; - else - { - BATTLE_STRUCT->sub80170DC_Bank++; - if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 1; - gBattleTextBuff1[4] = gDisableStructs[gActiveBank].perishSong1; - gBattleTextBuff1[5] = 0xFF; - if (gDisableStructs[gActiveBank].perishSong1 == 0) - { - gStatuses3[gActiveBank] &= ~(STATUS3_PERISH_SONG); - gBattleMoveDamage = gBattleMons[gActiveBank].hp; - gBattlescriptCurrInstr = BattleScript_PerishSongHits; - } - else - { - gDisableStructs[gActiveBank].perishSong1--; - gBattlescriptCurrInstr = BattleScript_PerishSongTimerGoesDown; - } - b_call_bc_move_exec(gBattlescriptCurrInstr); - return 1; - } - } - } - break; - } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); - return 0; -} - -#define HandleFaintedMonActions_MAX_CASE 7 - -bool8 HandleFaintedMonActions(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - return 0; - do - { - int i; - switch (BATTLE_STRUCT->sub80173A4_Tracker) - { - case 0: - BATTLE_STRUCT->unk1605A = 0; - BATTLE_STRUCT->sub80173A4_Tracker++; - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gAbsentBankFlags & gBitTable[i] && !sub_8018018(i, 6, 6)) - gAbsentBankFlags &= ~(gBitTable[i]); - } - case 1: - do - { - gBank1 = gBankTarget = BATTLE_STRUCT->unk1605A; - if (gBattleMons[BATTLE_STRUCT->unk1605A].hp == 0 && !(BATTLE_STRUCT->unk16113 & gBitTable[gBattlePartyID[BATTLE_STRUCT->unk1605A]]) && !(gAbsentBankFlags & gBitTable[BATTLE_STRUCT->unk1605A])) - { - b_call_bc_move_exec(BattleScript_GiveExp); - BATTLE_STRUCT->sub80173A4_Tracker = 2; - return 1; - } - } while (++BATTLE_STRUCT->unk1605A != gNoOfAllBanks); - BATTLE_STRUCT->sub80173A4_Tracker = 3; - break; - case 2: - sub_8015740(gBank1); - if (++BATTLE_STRUCT->unk1605A == gNoOfAllBanks) - BATTLE_STRUCT->sub80173A4_Tracker = 3; - else - BATTLE_STRUCT->sub80173A4_Tracker = 1; - break; - case 3: - BATTLE_STRUCT->unk1605A = 0; - BATTLE_STRUCT->sub80173A4_Tracker++; - case 4: - do - { - gBank1 = gBankTarget = BATTLE_STRUCT->unk1605A; //or should banks be switched? - if (gBattleMons[BATTLE_STRUCT->unk1605A].hp == 0 && !(gAbsentBankFlags & gBitTable[BATTLE_STRUCT->unk1605A])) - { - b_call_bc_move_exec(BattleScript_HandleFaintedMon); - BATTLE_STRUCT->sub80173A4_Tracker = 5; - return 1; - } - } while (++BATTLE_STRUCT->unk1605A != gNoOfAllBanks); - BATTLE_STRUCT->sub80173A4_Tracker = 6; - break; - case 5: - if (++BATTLE_STRUCT->unk1605A == gNoOfAllBanks) - BATTLE_STRUCT->sub80173A4_Tracker = 6; - else - BATTLE_STRUCT->sub80173A4_Tracker = 4; - break; - case 6: - if (AbilityBattleEffects(9, 0, 0, 0, 0) || AbilityBattleEffects(0xB, 0, 0, 0, 0) || ItemBattleEffects(1, 0, 1) || AbilityBattleEffects(6, 0, 0, 0, 0)) - return 1; - BATTLE_STRUCT->sub80173A4_Tracker++; - break; - case 7: - break; - } - } while (BATTLE_STRUCT->sub80173A4_Tracker != HandleFaintedMonActions_MAX_CASE); - return 0; -} - -void b_clear_atk_up_if_hit_flag_unless_enraged(void) -{ - int i; - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].status2 & STATUS2_RAGE && gChosenMovesByBanks[i] != MOVE_RAGE) - gBattleMons[i].status2 &= ~(STATUS2_RAGE); - } -} - -#define ATKCANCELLER_MAX_CASE 14 - -u8 AtkCanceller_UnableToUseMove(void) -{ - u8 effect = 0; - s32* bideDmg = &BATTLE_STRUCT->bideDmg; - do - { - switch (BATTLE_STRUCT->atkCancellerTracker) - { - case 0: // flags clear - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_DESTINY_BOND); - gStatuses3[gBankAttacker] &= ~(STATUS3_GRUDGE); - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 1: // check being asleep - if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) - { - if (UproarWakeUpCheck(gBankAttacker)) - { - gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - b_movescr_stack_push_cursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; - effect = 2; - } - else - { - u8 toSub; - if (gBattleMons[gBankAttacker].ability == ABILITY_EARLY_BIRD) - toSub = 2; - else - toSub = 1; - if ((gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) < toSub) - gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); - else - gBattleMons[gBankAttacker].status1 -= toSub; - if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) - { - if (gCurrentMove != MOVE_SNORE && gCurrentMove != MOVE_SLEEP_TALK) - { - gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 2; - } - } - else - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); - b_movescr_stack_push_cursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; - effect = 2; - } - } - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 2: // check being frozen - if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE) - { - if (Random() % 5) - { - if (gBattleMoves[gCurrentMove].effect != EFFECT_THAW_HIT) // unfreezing via a move effect happens in case 13 - { - gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; - gHitMarker |= HITMARKER_NO_ATTACKSTRING; - } - else - { - BATTLE_STRUCT->atkCancellerTracker++; - break; - } - } - else // unfreeze - { - gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - effect = 2; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 3: // truant - if (gBattleMons[gBankAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBankAttacker].truantCounter) - { - CancelMultiTurnMoves(gBankAttacker); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - gBattleMoveFlags |= MOVESTATUS_MISSED; - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 4: // recharge - if (gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE) - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RECHARGE); - gDisableStructs[gBankAttacker].rechargeCounter = 0; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 5: // flinch - if (gBattleMons[gBankAttacker].status2 & STATUS2_FLINCHED) - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_FLINCHED); - gProtectStructs[gBankAttacker].flinchImmobility = 1; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 6: // disabled move - if (gDisableStructs[gBankAttacker].disabledMove == gCurrentMove && gDisableStructs[gBankAttacker].disabledMove != 0) - { - gProtectStructs[gBankAttacker].usedDisabledMove = 1; - BATTLE_STRUCT->scriptingActive = gBankAttacker; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 7: // taunt - if (gDisableStructs[gBankAttacker].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0) - { - gProtectStructs[gBankAttacker].usedTauntedMove = 1; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 8: // imprisoned - if (IsImprisoned(gBankAttacker, gCurrentMove)) - { - gProtectStructs[gBankAttacker].usedImprisionedMove = 1; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 9: // confusion - if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION) - { - gBattleMons[gBankAttacker].status2--; - if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION) - { - if (Random() & 1) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - b_movescr_stack_push_cursor(); - } - else // confusion dmg - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBankTarget = gBankAttacker; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker); - gProtectStructs[gBankAttacker].confusionSelfDmg = 1; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; - } - else // snapped out of confusion - { - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; - } - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 10: // paralysis - if (gBattleMons[gBankAttacker].status1 & STATUS_PARALYSIS && (Random() % 4) == 0) - { - gProtectStructs[gBankAttacker].prlzImmobility = 1; - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 11: // infatuation - if (gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) - { - BATTLE_STRUCT->scriptingActive = CountTrailingZeroBits((gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) >> 0x10); - if (Random() & 1) - b_movescr_stack_push_cursor(); - else - { - b_movescr_stack_push(BattleScript_MoveUsedIsParalyzedCantAttack); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gProtectStructs[gBankAttacker].loveImmobility = 1; - CancelMultiTurnMoves(gBankAttacker); - } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 12: // bide - if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE) - { - gBattleMons[gBankAttacker].status2 -= 0x100; - if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE) - gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; - else - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); - if (gTakenDmg[gBankAttacker]) - { - gCurrentMove = MOVE_BIDE; - *bideDmg = gTakenDmg[gBankAttacker] * 2; - gBankTarget = gTakenDmgBanks[gBankAttacker]; - if (gAbsentBankFlags & gBitTable[gBankTarget]) - gBankTarget = GetMoveTarget(MOVE_BIDE, 1); - gBattlescriptCurrInstr = BattleScript_BideAttack; - } - else - gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; - } - effect = 1; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 13: // move thawing - if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE) - { - if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) - { - gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - effect = 2; - } - BATTLE_STRUCT->atkCancellerTracker++; - break; - case 14: // last case - break; - } - - } while (BATTLE_STRUCT->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0); - - if (effect == 2) - { - gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - } - return effect; -} - -bool8 sub_8018018(u8 bank, u8 r1, u8 r2) -{ - struct Pokemon* party; - u8 r7; - u8 r6; - s32 i; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - return 0; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - r7 = sub_803FC34(bank); - if (GetBankSide(bank) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - r6 = sub_803FBFC(r7); - for (i = r6 * 3; i < r6 * 3 + 3; i++) - { - if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) - break; - } - return (i == r6 * 3 + 3); - } - else - { - if (GetBankSide(bank) == 1) - { - r7 = GetBankByIdentity(1); - r6 = GetBankByIdentity(3); - party = gEnemyParty; - } - else - { - r7 = GetBankByIdentity(0); - r6 = GetBankByIdentity(2); - party = gPlayerParty; - } - if (r1 == 6) - r1 = gBattlePartyID[r7]; - if (r2 == 6) - r2 = gBattlePartyID[r6]; - for (i = 0; i < 6; i++) - { - if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG && i != r1 && i != r2 && i != ewram16068arr(r7) && i != ewram16068arr(r6)) - break; - } - return (i == 6); - } -} - -enum -{ - CASTFORM_NO_CHANGE, //0 - CASTFORM_TO_NORMAL, //1 - CASTFORM_TO_FIRE, //2 - CASTFORM_TO_WATER, //3 - CASTFORM_TO_ICE, //4 -}; - -u8 CastformDataTypeChange(u8 bank) -{ - u8 formChange = 0; - if (gBattleMons[bank].species != SPECIES_CASTFORM || gBattleMons[bank].ability != ABILITY_FORECAST || gBattleMons[bank].hp == 0) - return CASTFORM_NO_CHANGE; - if (!WEATHER_HAS_EFFECT && gBattleMons[bank].type1 != TYPE_NORMAL && gBattleMons[bank].type2 != TYPE_NORMAL) - { - gBattleMons[bank].type1 = TYPE_NORMAL; - gBattleMons[bank].type2 = TYPE_NORMAL; - return CASTFORM_TO_NORMAL; - } - if (!WEATHER_HAS_EFFECT) - return CASTFORM_NO_CHANGE; - if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL)) && gBattleMons[bank].type1 != TYPE_NORMAL && gBattleMons[bank].type2 != TYPE_NORMAL) - { - gBattleMons[bank].type1 = TYPE_NORMAL; - gBattleMons[bank].type2 = TYPE_NORMAL; - formChange = CASTFORM_TO_NORMAL; - } - if (gBattleWeather & WEATHER_SUN_ANY && gBattleMons[bank].type1 != TYPE_FIRE && gBattleMons[bank].type2 != TYPE_FIRE) - { - gBattleMons[bank].type1 = TYPE_FIRE; - gBattleMons[bank].type2 = TYPE_FIRE; - formChange = CASTFORM_TO_FIRE; - } - if (gBattleWeather & WEATHER_RAIN_ANY && gBattleMons[bank].type1 != TYPE_WATER && gBattleMons[bank].type2 != TYPE_WATER) - { - gBattleMons[bank].type1 = TYPE_WATER; - gBattleMons[bank].type2 = TYPE_WATER; - formChange = CASTFORM_TO_WATER; - } - if (gBattleWeather & WEATHER_HAIL && gBattleMons[bank].type1 != TYPE_ICE && gBattleMons[bank].type2 != TYPE_ICE) - { - gBattleMons[bank].type1 = TYPE_ICE; - gBattleMons[bank].type2 = TYPE_ICE; - formChange = CASTFORM_TO_ICE; - } - return formChange; -} - -u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) -{ - u8 effect = 0; - struct Pokemon* pokeAtk; - struct Pokemon* pokeDef; - u16 speciesAtk; - u16 speciesDef; - u32 pidAtk; - u32 pidDef; - - if (gBankAttacker >= gNoOfAllBanks) - gBankAttacker = bank; - if (GetBankSide(gBankAttacker) == 0) - pokeAtk = &gPlayerParty[gBattlePartyID[gBankAttacker]]; - else - pokeAtk = &gEnemyParty[gBattlePartyID[gBankAttacker]]; - - if (gBankTarget >= gNoOfAllBanks) - gBankTarget = bank; - if (GetBankSide(gBankTarget) == 0) - pokeDef = &gPlayerParty[gBattlePartyID[gBankTarget]]; - else - pokeDef = &gEnemyParty[gBattlePartyID[gBankTarget]]; - - speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES); - pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY); - - speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES); - pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY); - - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // why isn't that check done at the beginning? - { - u8 moveType; - s32 i; - u16 move; - u8 side; - u8 target1; - - if (special) - gLastUsedAbility = special; - else - gLastUsedAbility = gBattleMons[bank].ability; - - if (moveArg) - move = moveArg; - else - move = gCurrentMove; - - if (BATTLE_STRUCT->dynamicMoveType) - moveType = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - moveType = gBattleMoves[move].type; - - //_080184AC - switch (caseID) - { - case ABILITYEFFECT_ON_SWITCHIN: // 0 - //_08018518 - if (gBankAttacker >= gNoOfAllBanks) - gBankAttacker = bank; - switch (gLastUsedAbility) - { - case 0xFF: //weather from overworld - //_08018586 - switch (weather_get_current()) - { - case WEATHER_RAIN_LIGHT: - case WEATHER_RAIN_MED: - case WEATHER_RAIN_HEAVY: - if (!(gBattleWeather & WEATHER_RAIN_ANY)) - { - gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); - BATTLE_STRUCT->animArg1 = B_ANIM_RAIN_CONTINUES; - BATTLE_STRUCT->scriptingActive = bank; - effect++; - } - break; - case WEATHER_SANDSTORM: - if (!(gBattleWeather & WEATHER_SANDSTORM_ANY)) - { - gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - BATTLE_STRUCT->animArg1 = B_ANIM_SANDSTORM_CONTINUES; - BATTLE_STRUCT->scriptingActive = bank; - effect++; - } - break; - case WEATHER_DROUGHT: - if (!(gBattleWeather & WEATHER_SUN_ANY)) - { - gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); - BATTLE_STRUCT->animArg1 = B_ANIM_SUN_CONTINUES; - BATTLE_STRUCT->scriptingActive = bank; - effect++; - } - break; - } - if (effect) - { - gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current(); - b_push_move_exec(BattleScript_OverworldWeatherStarts); - } - break; - case ABILITY_DRIZZLE: - //_08018680 - if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) - { - gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); - b_push_move_exec(BattleScript_DrizzleActivates); - BATTLE_STRUCT->scriptingActive = bank; - effect++; - } - break; - case ABILITY_SAND_STREAM: - //_080186B8 - if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT)) - { - gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - b_push_move_exec(BattleScript_SandstreamActivates); - BATTLE_STRUCT->scriptingActive = bank; - effect++; - } - break; - case ABILITY_DROUGHT: - //_080186F0 - if (!(gBattleWeather & WEATHER_SUN_PERMANENT)) - { - gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); - b_push_move_exec(BattleScript_DroughtActivates); - BATTLE_STRUCT->scriptingActive = bank; - effect++; - } - break; - case ABILITY_INTIMIDATE: - //_08018728 - if (!(gSpecialStatuses[bank].intimidatedPoke)) - { - gStatuses3[bank] |= STATUS3_INTIMIDATE_POKES; - gSpecialStatuses[bank].intimidatedPoke = 1; - } - break; - case ABILITY_FORECAST: - //_0801875C - effect = CastformDataTypeChange(bank); - if (effect != 0) - { - b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->scriptingActive = bank; - BATTLE_STRUCT->castformToChangeInto = effect - 1; - } - break; - case ABILITY_TRACE: - //_080187A0 - if (!(gSpecialStatuses[bank].traced)) - { - gStatuses3[bank] |= STATUS3_TRACE; - gSpecialStatuses[bank].traced = 1; - } - break; - case ABILITY_CLOUD_NINE: - case ABILITY_AIR_LOCK: - //_080187DC - { - // that's a weird choice for a variable, why not use i or bank? - for (target1 = 0; target1 < gNoOfAllBanks; target1++) - { - effect = CastformDataTypeChange(target1); - if (effect != 0) - { - b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->scriptingActive = target1; - BATTLE_STRUCT->castformToChangeInto = effect - 1; - break; - } - } - } - break; - } - break; - case ABILITYEFFECT_ENDTURN: // 1 - //_08018814 - if (gBattleMons[bank].hp != 0) - { - gBankAttacker = bank; - switch (gLastUsedAbility) - { - case ABILITY_RAIN_DISH: - if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) - && gBattleMons[bank].maxHP > gBattleMons[bank].hp) - { - gLastUsedAbility = ABILITY_RAIN_DISH; // why - b_push_move_exec(BattleScript_RainDishActivates); - gBattleMoveDamage = gBattleMons[bank].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - effect++; - } - break; - case ABILITY_SHED_SKIN: - if ((gBattleMons[bank].status1 & STATUS_ANY) && (Random() % 3) == 0) - { - if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON)) - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - if (gBattleMons[bank].status1 & STATUS_SLEEP) - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - if (gBattleMons[bank].status1 & STATUS_BURN) - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - if (gBattleMons[bank].status1 & STATUS_FREEZE) - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - gBattleMons[bank].status1 = 0; - // BUG: The nightmare status does not get cleared here. This was fixed in Emerald. - //gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - BATTLE_STRUCT->scriptingActive = gActiveBank = bank; - b_push_move_exec(BattleScript_ShedSkinActivates); - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); - MarkBufferBankForExecution(gActiveBank); - effect++; - } - break; - case ABILITY_SPEED_BOOST: - if (gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC && gDisableStructs[bank].isFirstTurn != 2) - { - gBattleMons[bank].statStages[STAT_STAGE_SPEED]++; - BATTLE_STRUCT->animArg1 = 0x11; - BATTLE_STRUCT->animArg2 = 0; - b_push_move_exec(BattleScript_SpeedBoostActivates); - BATTLE_STRUCT->scriptingActive = bank; - effect++; - } - break; - case ABILITY_TRUANT: - gDisableStructs[gBankAttacker].truantCounter ^= 1; - break; - } - } - break; - case ABILITYEFFECT_MOVES_BLOCK: // 2 - //_08018A40 - if (gLastUsedAbility == ABILITY_SOUNDPROOF) - { - for (i = 0; gSoundMovesTable[i] != 0xFFFF; i++) - { - if (gSoundMovesTable[i] == move) - break; - } - if (gSoundMovesTable[i] != 0xFFFF) - { - if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - gBattlescriptCurrInstr = BattleScript_SoundproofProtected; - effect = 1; - } - } - break; - case ABILITYEFFECT_ABSORBING: // 3 - //_08018AD8 - if (move) - { - switch (gLastUsedAbility) - { - case ABILITY_VOLT_ABSORB: - if (moveType == TYPE_ELECTRIC && gBattleMoves[move].power != 0) - { - if (gProtectStructs[gBankAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - effect = 1; - } - break; - case ABILITY_WATER_ABSORB: - if (moveType == TYPE_WATER && gBattleMoves[move].power != 0) - { - if (gProtectStructs[gBankAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - effect = 1; - } - break; - case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && !(gBattleMons[bank].status1 & STATUS_FREEZE)) - { - if (!(eFlashFireArr.arr[bank] & 1)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (gProtectStructs[gBankAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - eFlashFireArr.arr[bank] |= 1; - effect = 2; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - if (gProtectStructs[gBankAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - effect = 2; - } - } - break; - } - if (effect == 1) - { - if (gBattleMons[bank].maxHP == gBattleMons[bank].hp) - { - if ((gProtectStructs[gBankAttacker].notFirstStrike)) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_FullHP; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_FullHP_PPLoss; - } - else - { - gBattleMoveDamage = gBattleMons[bank].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - } - } - } - break; - case ABILITYEFFECT_CONTACT: // 4 - //_08018CF0 - switch (gLastUsedAbility) - { - case ABILITY_COLOR_CHANGE: - //_08018DCC - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && move != MOVE_STRUGGLE - && gBattleMoves[move].power != 0 - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && gBattleMons[bank].type1 != moveType - && gBattleMons[bank].type2 != moveType - && gBattleMons[bank].hp != 0) - { - gBattleMons[bank].type1 = moveType; - gBattleMons[bank].type2 = moveType; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = moveType; - gBattleTextBuff1[3] = 0xFF; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; - effect++; - } - break; - case ABILITY_ROUGH_SKIN: - //_08018E94 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; - effect++; - } - break; - case ABILITY_EFFECT_SPORE: - //_08018F54 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 10) == 0) - { - do - { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; - } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); - if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) - gBattleCommunication[MOVE_EFFECT_BYTE] += 2; - gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITY_POISON_POINT: - //_0801904C - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITY_STATIC: - //_08019128 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITY_FLAME_BODY: - //_08019204 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITY_CUTE_CHARM: - //_080192E0 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && gBattleMons[gBankTarget].hp != 0 - && (Random() % 3) == 0 - && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) - && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF - && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) - { - gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; - effect++; - } - break; - } - break; - case ABILITYEFFECT_IMMUNITY: // 5 - //_08019448 - { - for (bank = 0; bank < gNoOfAllBanks; bank++) - { - switch (gBattleMons[bank].ability) - { - case ABILITY_IMMUNITY: - if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00)) // TODO: what is 0xF00? - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - effect = 1; - } - break; - case ABILITY_OWN_TEMPO: - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - effect = 2; - } - break; - case ABILITY_LIMBER: - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - effect = 1; - } - break; - case ABILITY_INSOMNIA: - case ABILITY_VITAL_SPIRIT: - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - effect = 1; - } - break; - case ABILITY_WATER_VEIL: - if (gBattleMons[bank].status1 & STATUS_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - effect = 1; - } - break; - case ABILITY_MAGMA_ARMOR: - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - effect = 1; - } - break; - case ABILITY_OBLIVIOUS: - if (gBattleMons[bank].status2 & STATUS2_INFATUATION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - effect = 3; - } - break; - } - if (effect) - { - switch (effect) - { - case 1: // status cleared - gBattleMons[bank].status1 = 0; - break; - case 2: // get rid of confusion - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - break; - case 3: // get rid of infatuation - gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); - break; - } - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; - BATTLE_STRUCT->scriptingActive = bank; - gActiveBank = bank; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - return effect; - } - } - } - break; - case ABILITYEFFECT_FORECAST: // 6 - //_080197B4 - { - for (bank = 0; bank < gNoOfAllBanks; bank++) - { - if (gBattleMons[bank].ability == ABILITY_FORECAST) - { - effect = CastformDataTypeChange(bank); - if (effect) - { - b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->scriptingActive = bank; - BATTLE_STRUCT->castformToChangeInto = effect - 1; - return effect; - } - } - } - } - break; - case ABILITYEFFECT_SYNCHRONIZE: // 7 - //_08019804 - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) - { - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); - BATTLE_STRUCT->synchroniseEffect &= 0x3F; - if (BATTLE_STRUCT->synchroniseEffect == 6) - BATTLE_STRUCT->synchroniseEffect = 2; - gBattleCommunication[MOVE_EFFECT_BYTE] = BATTLE_STRUCT->synchroniseEffect + 0x40; - BATTLE_STRUCT->scriptingActive = gBankTarget; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 - //_08019880 - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) - { - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); - BATTLE_STRUCT->synchroniseEffect &= 0x3F; - if (BATTLE_STRUCT->synchroniseEffect == 6) - BATTLE_STRUCT->synchroniseEffect = 2; - gBattleCommunication[MOVE_EFFECT_BYTE] = BATTLE_STRUCT->synchroniseEffect; - BATTLE_STRUCT->scriptingActive = gBankAttacker; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITYEFFECT_INTIMIDATE1: // 9 - //_080198FC - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) - { - gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - b_push_move_exec(gUnknown_081D978C); - BATTLE_STRUCT->intimidateBank = i; - effect++; - break; - } - } - break; - case ABILITYEFFECT_TRACE: // 11 - //_08019940 - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) - { - u8 target2; - side = (GetBankIdentity(i) ^ 1) & 1; - target1 = GetBankByIdentity(side); - target2 = GetBankByIdentity(side + 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 - && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) - { - //_080199AE - gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | side); - gBattleMons[i].ability = gBattleMons[gActiveBank].ability; - gLastUsedAbility = gBattleMons[gActiveBank].ability; - effect++; - } - else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) - { - //_08019A34 - gActiveBank = target1; - gBattleMons[i].ability = gBattleMons[gActiveBank].ability; - gLastUsedAbility = gBattleMons[gActiveBank].ability; - effect++; - } - else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) - { - //_08019A78 - gActiveBank = target2; - gBattleMons[i].ability = gBattleMons[gActiveBank].ability; - gLastUsedAbility = gBattleMons[gActiveBank].ability; - effect++; - } - } - else - //_08019ABC - { - gActiveBank = target1; - if (gBattleMons[target1].ability && gBattleMons[target1].hp) - { - gBattleMons[i].ability = gBattleMons[target1].ability; - gLastUsedAbility = gBattleMons[target1].ability; - effect++; - } - } - if (effect) - { - b_push_move_exec(BattleScript_TraceActivates); - gStatuses3[i] &= ~(STATUS3_TRACE); - BATTLE_STRUCT->scriptingActive = i; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gActiveBank; - gBattleTextBuff1[3] = gBattlePartyID[gActiveBank]; - gBattleTextBuff1[4] = EOS; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 9; - gBattleTextBuff2[2] = gLastUsedAbility; - gBattleTextBuff2[3] = EOS; - break; - } - } - } - break; - case ABILITYEFFECT_INTIMIDATE2: // 10 - //_08019B1C - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) - { - gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = gUnknown_081D9795; - BATTLE_STRUCT->intimidateBank = i; - effect++; - break; - } - } - break; - case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12 - //_08019B60 - side = GetBankSide(bank); - for (i = 0; i < gNoOfAllBanks; i++) - { - if (GetBankSide(i) != side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_CHECK_BANK_SIDE: // 13 - //_08019BBC - side = GetBankSide(bank); - for (i = 0; i < gNoOfAllBanks; i++) - { - if (GetBankSide(i) == side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_FIELD_SPORT: // 14 - //_08019C18 - switch (gLastUsedAbility) - { - case 0xFD: - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gStatuses3[i] & STATUS3_MUDSPORT) - effect = i + 1; - } - break; - case 0xFE: - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gStatuses3[i] & STATUS3_WATERSPORT) - effect = i + 1; - } - break; - default: - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - } - break; - case ABILITYEFFECT_CHECK_ON_FIELD: // 19 - //_08019CD4 - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK: // 15 - //_08019D18 - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].ability == ability && i != bank) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_COUNT_OTHER_SIZE: // 16 - //_08019D5C - side = GetBankSide(bank); - for (i = 0; i < gNoOfAllBanks; i++) - { - if (GetBankSide(i) != side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect++; - } - } - break; - case ABILITYEFFECT_COUNT_BANK_SIDE: // 17 - //_08019DB8 - side = GetBankSide(bank); - for (i = 0; i < gNoOfAllBanks; i++) - { - if (GetBankSide(i) == side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect++; - } - } - break; - case ABILITYEFFECT_COUNT_ON_FIELD: // 18 - //_08019F44 - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].ability == ability && i != bank) - { - gLastUsedAbility = ability; - effect++; - } - } - break; - } - //_08019F76 - if (effect && caseID < 0xC && gLastUsedAbility != 0xFF) - RecordAbilityBattle(bank, gLastUsedAbility); - } - - return effect; -} - -void b_call_bc_move_exec(u8* BS_ptr) -{ - gBattlescriptCurrInstr = BS_ptr; - B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; - gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack; - gCurrentActionFuncId = 0; -} - -void b_push_move_exec(u8* BS_ptr) -{ - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BS_ptr; - B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; - gBattleMainFunc = RunBattleScriptCommands; -} - -enum -{ - ITEM_NO_EFFECT, // 0 - ITEM_STATUS_CHANGE, // 1 - ITEM_EFFECT_OTHER, // 2 - ITEM_PP_CHANGE, // 3 - ITEM_HP_CHANGE, // 4 - ITEM_STATS_CHANGE, // 5 -}; - -enum -{ - FLAVOR_SPICY, // 0 - FLAVOR_DRY, // 1 - FLAVOR_SWEET, // 2 - FLAVOR_BITTER, // 3 - FLAVOR_SOUR, // 4 -}; - -u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) -{ - int i = 0; - u8 effect = ITEM_NO_EFFECT; - u8 changedPP = 0; - u8 bankHoldEffect, atkHoldEffect, defHoldEffect; - u8 bankQuality, atkQuality, defQuality; - u16 atkItem, defItem; - - gLastUsedItem = gBattleMons[bank].item; - if (gLastUsedItem == ITEM_ENIGMA_BERRY) - { - bankHoldEffect = gEnigmaBerries[bank].holdEffect; - bankQuality = gEnigmaBerries[bank].holdEffectParam; - } - else - { - bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem); - } - - atkItem = gBattleMons[gBankAttacker].item; - if (atkItem == ITEM_ENIGMA_BERRY) - { - atkHoldEffect = gEnigmaBerries[gBankAttacker].holdEffect; - atkQuality = gEnigmaBerries[gBankAttacker].holdEffectParam; - } - else - { - atkHoldEffect = ItemId_GetHoldEffect(atkItem); - atkQuality = ItemId_GetHoldEffectParam(atkItem); - } - - // def variables are unused - defItem = gBattleMons[gBankTarget].item; - if (defItem == ITEM_ENIGMA_BERRY) - { - defHoldEffect = gEnigmaBerries[gBankTarget].holdEffect; - defQuality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - defHoldEffect = ItemId_GetHoldEffect(defItem); - defQuality = ItemId_GetHoldEffectParam(defItem); - } - - switch (caseID) - { - case 0: - switch (bankHoldEffect) - { - case HOLD_EFFECT_DOUBLE_PRIZE: - BATTLE_STRUCT->moneyMultiplier = 2; - break; - case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) - { - if (gBattleMons[bank].statStages[i] < 6) - { - gBattleMons[bank].statStages[i] = 6; - effect = ITEM_STATS_CHANGE; - } - } - if (effect) - { - BATTLE_STRUCT->scriptingActive = bank; - gStringBank = bank; - gActiveBank = gBankAttacker = bank; - b_call_bc_move_exec(BattleScript_WhiteHerbEnd2); - } - break; - } - break; - case 1: - if (gBattleMons[bank].hp) - { - switch (bankHoldEffect) - { - case HOLD_EFFECT_RESTORE_HP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleMoveDamage = bankQuality; - if (gBattleMons[bank].hp + bankQuality > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); - effect = 4; - } - break; - case HOLD_EFFECT_RESTORE_PP: - if (!moveTurn) - { - struct Pokemon* poke; - u8 ppBonuses; - u16 move; - - if (GetBankSide(bank) == 0) - poke = &gPlayerParty[gBattlePartyID[bank]]; - else - poke = &gEnemyParty[gBattlePartyID[bank]]; - for (i = 0; i < 4; i++) - { - move = GetMonData(poke, MON_DATA_MOVE1 + i); - changedPP = GetMonData(poke, MON_DATA_PP1 + i); - ppBonuses = GetMonData(poke, MON_DATA_PP_BONUSES); - if (move && changedPP == 0) - break; - } - if (i != 4) - { - u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); - if (changedPP + bankQuality > maxPP) - changedPP = maxPP; - else - changedPP = changedPP + bankQuality; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = move; - gBattleTextBuff1[3] = move >> 8; - gBattleTextBuff1[4] = 0xFF; - b_call_bc_move_exec(BattleScript_BerryPPHealEnd2); - EmitSetAttributes(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); - MarkBufferBankForExecution(gActiveBank); - effect = ITEM_PP_CHANGE; - } - } - break; - case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) - { - if (gBattleMons[bank].statStages[i] < 6) - { - gBattleMons[bank].statStages[i] = 6; - effect = ITEM_STATS_CHANGE; - } - } - if (effect) - { - BATTLE_STRUCT->scriptingActive = bank; - gStringBank = bank; - gActiveBank = gBankAttacker = bank; - b_call_bc_move_exec(BattleScript_WhiteHerbEnd2); - } - break; - case HOLD_EFFECT_LEFTOVERS: - if (gBattleMons[bank].hp < gBattleMons[bank].maxHP && !moveTurn) - { - gBattleMoveDamage = gBattleMons[bank].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - b_call_bc_move_exec(BattleScript_ItemHealHP_End2); - effect = ITEM_HP_CHANGE; - RecordItemBattle(bank, bankHoldEffect); - } - break; - // nice copy/paste there gamefreak, making a function for confuse berries was too much eh? - case HOLD_EFFECT_CONFUSE_SPICY: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_SPICY; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SPICY) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); - else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_CONFUSE_DRY: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_DRY; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_DRY) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); - else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_CONFUSE_SWEET: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_SWEET; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SWEET) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); - else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_CONFUSE_BITTER: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_BITTER; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_BITTER) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); - else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_CONFUSE_SOUR: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 8; - gBattleTextBuff1[2] = FLAVOR_SOUR; - gBattleTextBuff1[3] = EOS; - gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) - gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; - gBattleMoveDamage *= -1; - if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SOUR) < 0) - b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2); - else - b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } - break; - // copy/paste again, smh - case HOLD_EFFECT_ATTACK_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_ATK] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_ATK; - gBattleTextBuff1[3] = EOS; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = 0xD2; - gBattleTextBuff2[3] = 0xD2 >> 8; - gBattleTextBuff2[4] = EOS; - - gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_ATK; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_ATK; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_DEFENSE_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_DEF] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_DEF; - gBattleTextBuff1[3] = EOS; - - gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_DEF; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_DEF; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_SPEED_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_SPEED; - gBattleTextBuff1[3] = EOS; - - gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPEED; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPEED; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_SP_ATTACK_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPATK] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_SPATK; - gBattleTextBuff1[3] = EOS; - - gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPATK; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPATK; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_SP_DEFENSE_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPDEF] < 0xC) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = STAT_STAGE_SPDEF; - gBattleTextBuff1[3] = EOS; - - gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPDEF; - BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPDEF; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_CRITICAL_UP: - if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && !(gBattleMons[bank].status2 & STATUS2_FOCUS_ENERGY)) - { - gBattleMons[bank].status2 |= STATUS2_FOCUS_ENERGY; - b_call_bc_move_exec(BattleScript_BerryFocusEnergyEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_RANDOM_STAT_UP: - if (!moveTurn && gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality) - { - for (i = 0; i < 5; i++) - { - if (gBattleMons[bank].statStages[STAT_STAGE_ATK + i] < 0xC) - break; - } - if (i != 5) - { - do - { - i = Random() % 5; - } while (gBattleMons[bank].statStages[STAT_STAGE_ATK + i] == 0xC); - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = i + 1; - gBattleTextBuff1[3] = EOS; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = 0xD1; - gBattleTextBuff2[3] = 0xD1 >> 8; - gBattleTextBuff2[4] = 0; - gBattleTextBuff2[5] = 0xD2; - gBattleTextBuff2[6] = 0xD2 >> 8; - gBattleTextBuff2[7] = EOS; - - gEffectBank = bank; - BATTLE_STRUCT->statChanger = 0x21 + i; - BATTLE_STRUCT->animArg1 = 0x21 + i + 6; - BATTLE_STRUCT->animArg2 = 0; - b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - } - break; - case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS); - b_call_bc_move_exec(BattleScript_BerryCurePrlzEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[bank].status1 & STATUS_PSN_ANY) - { - gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER); - b_call_bc_move_exec(BattleScript_BerryCurePsnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[bank].status1 & STATUS_BURN) - { - gBattleMons[bank].status1 &= ~(STATUS_BURN); - b_call_bc_move_exec(BattleScript_BerryCureBrnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - gBattleMons[bank].status1 &= ~(STATUS_FREEZE); - b_call_bc_move_exec(BattleScript_BerryCureFrzEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status1 &= ~(STATUS_SLEEP); - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - b_call_bc_move_exec(BattleScript_BerryCureSlpEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - b_call_bc_move_exec(BattleScript_BerryCureConfusionEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_STATUS: - if (gBattleMons[bank].status1 & STATUS_ANY || gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - i = 0; - if (gBattleMons[bank].status1 & STATUS_PSN_ANY) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - i++; - } - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - i++; - } - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - i++; - } - if (gBattleMons[bank].status1 & STATUS_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - i++; - } - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - i++; - } - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - i++; - } - if (!(i > 1)) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleMons[bank].status1 = 0; - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - b_call_bc_move_exec(BattleScript_BerryCureChosenStatusEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_ATTRACT: - if (gBattleMons[bank].status2 & STATUS2_INFATUATION) - { - gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - b_call_bc_move_exec(BattleScript_BerryCureChosenStatusEnd2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - effect = ITEM_EFFECT_OTHER; - } - break; - } - if (effect) - { - BATTLE_STRUCT->scriptingActive = bank; - gStringBank = bank; - gActiveBank = gBankAttacker = bank; - switch (effect) - { - case ITEM_STATUS_CHANGE: - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); - MarkBufferBankForExecution(gActiveBank); - break; - case ITEM_PP_CHANGE: - if (!(gBattleMons[bank].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[bank].unk18_b & gBitTable[i])) - gBattleMons[bank].pp[i] = changedPP; - break; - } - } - } - break; - case 2: - break; - case 3: - for (bank = 0; bank < gNoOfAllBanks; bank++) - { - gLastUsedItem = gBattleMons[bank].item; - if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) - { - bankHoldEffect = gEnigmaBerries[bank].holdEffect; - bankQuality = gEnigmaBerries[bank].holdEffectParam; - } - else - { - bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem); - } - switch (bankHoldEffect) - { - case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureParRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[bank].status1 & STATUS_PSN_ANY) - { - gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[bank].status1 & STATUS_BURN) - { - gBattleMons[bank].status1 &= ~(STATUS_BURN); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - gBattleMons[bank].status1 &= ~(STATUS_FREEZE); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status1 &= ~(STATUS_SLEEP); - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_ATTRACT: - if (gBattleMons[bank].status2 & STATUS2_INFATUATION) - { - gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - b_movescr_stack_push_cursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_STATUS: - if (gBattleMons[bank].status1 & STATUS_ANY || gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - if (gBattleMons[bank].status1 & STATUS_PSN_ANY) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - } - if (gBattleMons[bank].status1 & STATUS_SLEEP) - { - gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - } - if (gBattleMons[bank].status1 & STATUS_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - } - if (gBattleMons[bank].status1 & STATUS_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - } - if (gBattleMons[bank].status1 & STATUS_FREEZE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - } - if (gBattleMons[bank].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - } - gBattleMons[bank].status1 = 0; - gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); - b_movescr_stack_push_cursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < 8; i++) - { - if (gBattleMons[bank].statStages[i] < 6) - { - gBattleMons[bank].statStages[i] = 6; - effect = ITEM_STATS_CHANGE; - } - } - if (effect) - { - BATTLE_STRUCT->scriptingActive = bank; - gStringBank = bank; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; - return effect; // unnecessary return - } - break; - } - if (effect) - { - BATTLE_STRUCT->scriptingActive = bank; - gStringBank = bank; - gActiveBank = bank; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - break; - } - } - break; - case 4: - if (gBattleMoveDamage) - { - switch (atkHoldEffect) - { - case HOLD_EFFECT_FLINCH: - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (Random() % 100) < bankQuality - && gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED - && gBattleMons[gBankTarget].hp) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 8; - b_movescr_stack_push_cursor(); - SetMoveEffect(0, 0); - b_movescr_stack_pop_cursor(); - } - break; - case HOLD_EFFECT_SHELL_BELL: - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gSpecialStatuses[gBankTarget].moveturnLostHP != 0 - && gSpecialStatuses[gBankTarget].moveturnLostHP != 0xFFFF - && gBankAttacker != gBankTarget - && gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP - && gBattleMons[gBankAttacker].hp != 0) - { - gLastUsedItem = atkItem; - gStringBank = gBankAttacker; - BATTLE_STRUCT->scriptingActive = gBankAttacker; - gBattleMoveDamage = (gSpecialStatuses[gBankTarget].moveturnLostHP / atkQuality) * -1; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = -1; - gSpecialStatuses[gBankTarget].moveturnLostHP = 0; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; - effect++; - } - break; - } - } - break; - } - - return effect; -} - -struct CombinedMove -{ - u16 move1; - u16 move2; - u16 newMove; -}; - -static const struct CombinedMove sCombinedMoves[2] = -{ - {MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE}, - {0xFFFF, 0xFFFF, 0xFFFF} -}; - -void unref_sub_801B40C(void) -{ - int i = 0; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - do - { - u8 bank = 0; - do - { - u8 absent = gAbsentBankFlags; - if (gBitTable[bank] & absent || absent & gBitTable[bank + 2]) - bank++; - else - { - if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank + 2]) - { - gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4); - gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; - gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4; - } - if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank + 2] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank]) - { - gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank + 2) | ((bank) << 4); - gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; - gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4; - } - bank++; - } - } while (bank < 2); - i++; - } while (sCombinedMoves[i].move1 != 0xFFFF); - } -} - -void sub_801B594(void) -{ - if (gBattleExecBuffer == 0) - gBattleScriptingCommandsTable[*gBattlescriptCurrInstr](); -} - -u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target -{ - u8 targetBank = 0; - u8 moveTarget; - u8 side; - - if (useMoveTarget) - moveTarget = useMoveTarget - 1; - else - moveTarget = gBattleMoves[move].target; - - switch (moveTarget) - { - case 0: - side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) - targetBank = gSideTimers[side].followmeTarget; - else - { - side = GetBankSide(gBankAttacker); - do - { - targetBank = Random() % gNoOfAllBanks; - } while (targetBank == gBankAttacker || side == GetBankSide(targetBank) || gAbsentBankFlags & gBitTable[targetBank]); - if (gBattleMoves[move].type == TYPE_ELECTRIC - && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_LIGHTNING_ROD, 0, 0) - && gBattleMons[targetBank].ability != ABILITY_LIGHTNING_ROD) - { - targetBank ^= 2; - RecordAbilityBattle(targetBank, gBattleMons[targetBank].ability); - gSpecialStatuses[targetBank].lightningRodRedirected = 1; - } - } - break; - case 1: - case 8: - case 32: - case 64: - targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); - if (gAbsentBankFlags & gBitTable[targetBank]) - targetBank ^= 2; - break; - case 4: - side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) - targetBank = gSideTimers[side].followmeTarget; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & 4) - { - if (GetBankSide(gBankAttacker) == 0) - { - if (Random() & 1) - targetBank = GetBankByIdentity(1); - else - targetBank = GetBankByIdentity(3); - } - else - { - if (Random() & 1) - targetBank = GetBankByIdentity(0); - else - targetBank = GetBankByIdentity(2); - } - if (gAbsentBankFlags & gBitTable[targetBank]) - targetBank ^= 2; - } - else - targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); - break; - case 2: - case 16: - targetBank = gBankAttacker; - break; - } - ewram16010arr(gBankAttacker) = targetBank; - return targetBank; -} - -u8 IsPokeDisobedient(void) -{ - u8 obedienceLevel; - s32 rnd; - s32 calc; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK - || GetBankSide(gBankAttacker) == 1 - || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName) - || FlagGet(FLAG_BADGE08_GET)) - return 0; - - obedienceLevel = 10; - if (FlagGet(FLAG_BADGE02_GET)) - obedienceLevel = 30; - if (FlagGet(FLAG_BADGE04_GET)) - obedienceLevel = 50; - if (FlagGet(FLAG_BADGE06_GET)) - obedienceLevel = 70; - - if (gBattleMons[gBankAttacker].level <= obedienceLevel) - return 0; - rnd = (Random() & 255); - calc = (gBattleMons[gBankAttacker].level + obedienceLevel) * rnd >> 8; - if (calc < obedienceLevel) - return 0; - - // is not obedient - if (gCurrentMove == MOVE_RAGE) - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RAGE); - if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK)) - { - gBattlescriptCurrInstr = gUnknown_081D995F; - return 1; - } - - rnd = (Random() & 255); - calc = (gBattleMons[gBankAttacker].level + obedienceLevel) * rnd >> 8; - if (calc < obedienceLevel) - { - calc = CheckMoveLimitations(gBankAttacker, gBitTable[gCurrMovePos], 0xFF); - if (calc == 0xF) // all moves cannot be used - { - gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - return 1; - } - else // use a random move - { - do - { - gCurrMovePos = gUnknown_02024BE5 = Random() & 3; - } while (gBitTable[gCurrMovePos] & calc); - gRandomMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; - gBattleCommunication[3] = 0; - gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; - gBankTarget = GetMoveTarget(gRandomMove, 0); - gHitMarker |= HITMARKER_x200000; - return 2; - } - } - else - { - obedienceLevel = gBattleMons[gBankAttacker].level - obedienceLevel; - - calc = (Random() & 255); - if (calc < obedienceLevel && !(gBattleMons[gBankAttacker].status1 & STATUS_ANY) && gBattleMons[gBankAttacker].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gBankAttacker].ability != ABILITY_INSOMNIA) - { - // try putting asleep - int i; - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleMons[i].status2 & STATUS2_UPROAR) - break; - } - if (i == gNoOfAllBanks) - { - gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; - return 1; - } - } - calc -= obedienceLevel; - if (calc < obedienceLevel) - { - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker); - gBankTarget = gBankAttacker; - gBattlescriptCurrInstr = gUnknown_081D99A0; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return 2; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - return 1; - } - } -} diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 3b1092e45..5a20a8324 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_util.h" #include "constants/battle_move_effects.h" #include "constants/moves.h" #include "constants/abilities.h" @@ -101,11 +102,10 @@ extern u16 gTrappingMoves[]; u8 AtkCanceller_UnableToUseMove(void); void PressurePPLose(u8 bank_atk, u8 bank_def, u16 move); void CancelMultiTurnMoves(u8 bank); -void b_movescr_stack_push(u8* BS_ptr); -void b_movescr_stack_push_cursor(void); +void BattleScriptPush(u8* BS_ptr); +void BattleScriptPushCursor(void); void RecordAbilityBattle(u8 bank, u8 ability); void RecordItemBattle(u8 bank, u8 holdEffect); -int IsPokeDisobedient(void); static bool8 IsTwoTurnsMove(u16 move); static void DestinyBondFlagUpdate(void); static void b_wonderguard_and_levitate(void); @@ -122,7 +122,7 @@ extern u8 gBattleBufferB[4][0x200]; void sub_80324F8(struct Pokemon*, u8 bank); void AdjustFriendship(struct Pokemon*, u8 value); bool8 IsTradedMon(struct Pokemon*); -void b_movescr_stack_pop_cursor(void); +void BattleScriptPop(void); void SwitchInClearStructs(void); u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8); u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); @@ -131,7 +131,6 @@ u8 sub_803FC34(u8 bank); u16 sub_803FBFC(u8 a); u8 GetBankByIdentity(u8 ID); void sub_8012258(u8); -void sub_80157C4(u8 bank); //update sent pokes in battle //MonTryLearningNewMove teach poke a move u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); void IncrementGameStat(u8 index); @@ -147,21 +146,17 @@ void nullsub_6(void); void ReshowBattleScreenAfterMenu(void); void BattleMainCB2(void); void AddMoney(u32* moneySaveblock, u32 to_give); -void sub_80156DC(void); //set sentpokes value u8 CountAliveMons(u8 caseID); void sub_803E1B0(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); u8 CanRunFromBattle(void); u8 GetMoveTarget(u16 move, u8 targetbyte); //get target of move -void sub_80153D0(u8 atk); //pressure perish song pp decrement u8 CastformDataTypeChange(u8 bank); -void b_push_move_exec(u8* bs_ptr); u8 Overworld_GetMapTypeOfSaveblockLocation(void); u8 CalculatePlayerPartyCount(void); u16 Sqrt(u32 num); u8 sub_809070C(u16 nationalNum, u32 TiD, u32 PiD); //task prepare poke dex display void sub_814A880(u8 a1, u8 a2); u8 CheckMoveLimitations(u8 bank, u8 unusable_moves, u8 flags); -void sub_801529C(u8 bank); bool8 IsLinkDoubleBattle(void); void sub_8094B6C(u8 bank, u8 partyID, u8 r2); @@ -1050,7 +1045,7 @@ static void atk00_attackcanceler(void) gHitMarker &= ~(HITMARKER_x800000); if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) { - u8 disobedient = IsPokeDisobedient(); + u8 disobedient = IsMonDisobedient(); asm("":::"r0"); //It's impossible to match asm("":::"r1"); if ((disobedient)) @@ -1067,7 +1062,7 @@ static void atk00_attackcanceler(void) { PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT); gProtectStructs[gBankTarget].bounceMove = 0; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; return; } @@ -1078,7 +1073,7 @@ static void atk00_attackcanceler(void) PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH); gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0; BATTLE_STRUCT->scriptingActive = gBanksByTurnOrder[i]; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SnatchedMove; return; } @@ -1087,7 +1082,7 @@ static void atk00_attackcanceler(void) { gSpecialStatuses[gBankTarget].lightningRodRedirected = 0; gLastUsedAbility = ABILITY_LIGHTNING_ROD; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TookAttack; RecordAbilityBattle(gBankTarget, gLastUsedAbility); } @@ -1325,7 +1320,7 @@ static void atk03_ppreduce(void) && !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos])) { gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]); + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]); MarkBufferBankForExecution(gBankAttacker); } } @@ -1844,7 +1839,7 @@ static void atk09_attackanimation(void) if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_Pausex20; BATTLE_STRUCT->animTurn += 1; BATTLE_STRUCT->animTargetsHit += 1; @@ -1868,7 +1863,7 @@ static void atk09_attackanimation(void) } else { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_Pausex20; } } @@ -1947,7 +1942,7 @@ static void atk0C_datahpupdate(void) if (gDisableStructs[gActiveBank].substituteHP == 0) { gBattlescriptCurrInstr += 2; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SubstituteFade; return; } @@ -2023,7 +2018,7 @@ static void atk0C_datahpupdate(void) } } gHitMarker &= ~(HITMARKER_x100000); - EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); + EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); MarkBufferBankForExecution(gActiveBank); } } @@ -2132,7 +2127,7 @@ static void atk0F_resultmessage(void) gLastUsedItem = gBattleMons[gBankTarget].item; gStringBank = gBankTarget; gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; default: @@ -2144,14 +2139,14 @@ static void atk0F_resultmessage(void) gBattleMoveFlags &= ~(MOVESTATUS_ONEHITKO); gBattleMoveFlags &= ~(MOVESTATUS_SUPEREFFECTIVE); gBattleMoveFlags &= ~(MOVESTATUS_NOTVERYEFFECTIVE); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; return; } else if (gBattleMoveFlags & MOVESTATUS_ENDURED) { gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EnduredMsg; return; } @@ -2160,7 +2155,7 @@ static void atk0F_resultmessage(void) gLastUsedItem = gBattleMons[gBankTarget].item; gStringBank = gBankTarget; gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; } @@ -2321,7 +2316,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); //_0801E664: gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) @@ -2336,7 +2331,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; @@ -2355,7 +2350,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gLastUsedAbility = ABILITY_WATER_VEIL; RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); //_0801E664: gBattlescriptCurrInstr = BattleScript_BRNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) @@ -2370,7 +2365,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; @@ -2399,7 +2394,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gLastUsedAbility = ABILITY_LIMBER; RecordAbilityBattle(gEffectBank, ABILITY_LIMBER); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); //_0801E664: gBattlescriptCurrInstr = BattleScript_PRLZPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) @@ -2421,7 +2416,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); //_0801E664: gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) @@ -2436,7 +2431,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; @@ -2458,14 +2453,14 @@ void SetMoveEffect(bool8 primary, u8 certainArg) } if (StatusChanged == 1) { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); if (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP) gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); else gBattleMons[gEffectBank].status1 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBank = gEffectBank; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); MarkBufferBankForExecution(gActiveBank); if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { @@ -2499,7 +2494,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 8: //flinch @@ -2528,7 +2523,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBank] = gCurrentMove; gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 11: //pay day @@ -2539,7 +2534,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (PayDay > gPaydayMoney) gPaydayMoney = 0xFFFF; } - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 9: //tri attack @@ -2561,7 +2556,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) BATTLE_STRUCT->wrappedMove[gEffectBank*2] = (u8)gCurrentMove; (1 + BATTLE_STRUCT->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask. BATTLE_STRUCT->wrappedBy[gEffectBank] = gBankAttacker; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gBattleCommunication[MULTISTRING_CHOOSER] = 0; while (gBattleCommunication[MULTISTRING_CHOOSER] <= 4 @@ -2572,7 +2567,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleMoveDamage = (gHP_dealt) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 15 ... 21: //stat + 1 @@ -2581,7 +2576,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; } break; @@ -2591,7 +2586,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; } break; @@ -2601,7 +2596,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; } break; @@ -2611,7 +2606,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; } break; @@ -2634,7 +2629,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) {gBattlescriptCurrInstr++; return;} if (gBattleMons[gBankTarget].item && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD) { - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_NoItemSteal; gLastUsedAbility = gBattleMons[gBankTarget].ability; RecordAbilityBattle(gBankTarget, gLastUsedAbility); @@ -2652,14 +2647,14 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleMons[gBankTarget].item = 0; gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); + EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); MarkBufferBankForExecution(gBankAttacker); gActiveBank = gBankTarget; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); + EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); MarkBufferBankForExecution(gBankTarget); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_ItemSteal; CHOICED_MOVE(gBankTarget) = 0; @@ -2675,11 +2670,11 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattlescriptCurrInstr++; break; case 34: //ancientpower - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AllStatsUp; return; case 35: //break free rapidspin - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_RapidSpinAway; return; case 36: //paralysis removal @@ -2687,23 +2682,23 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); gActiveBank = gBankTarget; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); MarkBufferBankForExecution(gActiveBank); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; } else {gBattlescriptCurrInstr++; return;} break; case 37: //superpower - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AtkDefDown; return; case 38: //33% recoil gBattleMoveDamage = gHP_dealt / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 53: //thrash @@ -2734,14 +2729,14 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gLastUsedItem = gBattleMons[gEffectBank].item; gBattleMons[gEffectBank].item = 0; gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlePartyID[gEffectBank]]; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_KnockedOff; CHOICED_MOVE(gEffectBank) = 0; } break; case 59: //overheat - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_SAtkDown2; return; } @@ -3065,7 +3060,7 @@ _0801E64A:\n\ ldr r4, _0801E67C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E680 @ =BattleScript_PSNPrevention\n\ _0801E664:\n\ str r0, [r4]\n\ @@ -3188,7 +3183,7 @@ _0801E72E:\n\ ldr r4, _0801E750 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E754 @ =BattleScript_BRNPrevention\n\ b _0801E664\n\ .align 2, 0\n\ @@ -3228,7 +3223,7 @@ _0801E78E:\n\ ldr r4, _0801E7A0 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E7A4 @ =BattleScript_BRNPrevention\n\ b _0801E998\n\ .align 2, 0\n\ @@ -3379,7 +3374,7 @@ _0801E8A6:\n\ ldr r4, _0801E8C8 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E8CC @ =BattleScript_PRLZPrevention\n\ b _0801E664\n\ .align 2, 0\n\ @@ -3422,7 +3417,7 @@ _0801E8FE:\n\ ldr r4, _0801E93C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E940 @ =BattleScript_PSNPrevention\n\ str r0, [r4]\n\ ldr r2, _0801E944 @ =gHitMarker\n\ @@ -3483,7 +3478,7 @@ _0801E98C:\n\ ldr r4, _0801E9A8 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801E9AC @ =BattleScript_PSNPrevention\n\ _0801E998:\n\ str r0, [r4]\n\ @@ -3556,7 +3551,7 @@ _0801EA1C:\n\ ldr r0, _0801EA5C @ =gBattlescriptCurrInstr\n\ ldr r0, [r0]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EA60 @ =gStatusFlagsForMoveEffects\n\ ldr r0, _0801EA64 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -3621,7 +3616,7 @@ _0801EA84:\n\ movs r1, 0x28\n\ movs r2, 0\n\ movs r3, 0x4\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r4]\n\ bl MarkBufferBankForExecution\n\ ldr r2, _0801EAF0 @ =gHitMarker\n\ @@ -3814,7 +3809,7 @@ _0801EC8E:\n\ ldr r4, _0801ECC8 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801ECCC @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801ECD0 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -3931,7 +3926,7 @@ _0801ED7C:\n\ ldr r4, _0801EDD0 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EDD4 @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801EDD8 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -3977,7 +3972,7 @@ _0801EE14:\n\ ldr r4, _0801EE40 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EE44 @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801EE48 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -4112,7 +4107,7 @@ _0801EEE8:\n\ ldr r4, _0801EF98 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EF9C @ =gMoveEffectBS_Ptrs\n\ ldr r2, _0801EFA0 @ =gBattleCommunication\n\ ldrb r0, [r2, 0x3]\n\ @@ -4177,7 +4172,7 @@ _0801EFC0:\n\ ldr r4, _0801EFE0 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801EFE4 @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801EFE8 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -4219,7 +4214,7 @@ _0801F008:\n\ ldr r4, _0801F038 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F03C @ =BattleScript_StatUp\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4257,7 +4252,7 @@ _0801F05E:\n\ ldr r4, _0801F08C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F090 @ =BattleScript_StatDown\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4294,7 +4289,7 @@ _0801F0B0:\n\ ldr r4, _0801F0E0 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F0E4 @ =BattleScript_StatUp\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4332,7 +4327,7 @@ _0801F106:\n\ ldr r4, _0801F134 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F138 @ =BattleScript_StatDown\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4545,7 +4540,7 @@ _0801F2B6:\n\ movs r1, 0x2\n\ movs r2, 0\n\ movs r3, 0x2\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ mov r3, r10\n\ ldrb r0, [r3]\n\ bl MarkBufferBankForExecution\n\ @@ -4563,13 +4558,13 @@ _0801F2B6:\n\ movs r1, 0x2\n\ movs r2, 0\n\ movs r3, 0x2\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r7]\n\ bl MarkBufferBankForExecution\n\ ldr r4, _0801F350 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F354 @ =BattleScript_ItemSteal\n\ str r0, [r4]\n\ ldr r0, _0801F358 @ =0xfffe9f10\n\ @@ -4644,7 +4639,7 @@ _0801F3BC:\n\ ldr r4, _0801F3CC @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F3D0 @ =BattleScript_AllStatsUp\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4654,7 +4649,7 @@ _0801F3D4:\n\ ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F3E8 @ =BattleScript_RapidSpinAway\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4690,13 +4685,13 @@ _0801F406:\n\ movs r1, 0x28\n\ movs r2, 0\n\ movs r3, 0x4\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r4]\n\ bl MarkBufferBankForExecution\n\ ldr r4, _0801F444 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F448 @ =BattleScript_TargetPRLZHeal\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4708,7 +4703,7 @@ _0801F44C:\n\ ldr r4, _0801F45C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F460 @ =BattleScript_AtkDefDown\n\ b _0801F5F8\n\ .align 2, 0\n\ @@ -4729,7 +4724,7 @@ _0801F47A:\n\ ldr r4, _0801F49C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _0801F4A0 @ =gMoveEffectBS_Ptrs\n\ ldr r0, _0801F4A4 @ =gBattleCommunication\n\ ldrb r0, [r0, 0x3]\n\ @@ -4857,7 +4852,7 @@ _0801F540:\n\ ldr r4, _0801F5C8 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F5CC @ =BattleScript_KnockedOff\n\ str r0, [r4]\n\ ldr r1, _0801F5D0 @ =gSharedMem\n\ @@ -4897,7 +4892,7 @@ _0801F5EC:\n\ ldr r4, _0801F60C @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\ _0801F5F8:\n\ str r0, [r4]\n\ @@ -4977,7 +4972,7 @@ static void atk19_tryfaintmon(void) { r4 = T1_READ_PTR(gBattlescriptCurrInstr + 3); - b_movescr_stack_pop_cursor(); + BattleScriptPop(); gBattlescriptCurrInstr = r4; gSideAffecting[GetBankSide(gActiveBank)] &= ~SIDE_STATUS_SPIKES_DAMAGED; } @@ -5013,7 +5008,7 @@ static void atk19_tryfaintmon(void) ewram16100arr2(3, bank) = 0; gHitMarker |= HITMARKER_FAINTED(gActiveBank); - b_movescr_stack_push(gBattlescriptCurrInstr + 7); + BattleScriptPush(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr = r4; if (GetBankSide(gActiveBank) == 0) { @@ -5036,7 +5031,7 @@ static void atk19_tryfaintmon(void) } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0) { - b_movescr_stack_push(gBattlescriptCurrInstr); + BattleScriptPush(gBattlescriptCurrInstr); gBattleMoveDamage = gBattleMons[bank].hp; gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; } @@ -5049,10 +5044,10 @@ static void atk19_tryfaintmon(void) u8 moveIndex = ewram1608Carr(gBankAttacker); gBattleMons[gBankAttacker].pp[moveIndex] = 0; - b_movescr_stack_push(gBattlescriptCurrInstr); + BattleScriptPush(gBattlescriptCurrInstr); gBattlescriptCurrInstr = BattleScript_SelectingImprisionedMoveInPalace; gActiveBank = gBankAttacker; - EmitSetAttributes(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBank].pp[moveIndex]); + EmitSetMonData(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBank].pp[moveIndex]); MarkBufferBankForExecution(gActiveBank); gBattleTextBuff1[0] = 0xFD; @@ -5087,7 +5082,7 @@ static void atk1B_cleareffectsonfaint(void) { gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); gBattleMons[gActiveBank].status1 = 0; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); UndoEffectsAfterFainting(); gBattlescriptCurrInstr += 2; @@ -5476,7 +5471,7 @@ static void atk23_getexp(void) gBattleTextBuff2[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); gBattleTextBuff2[5] = 0xFF; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gLeveledUpInBattle |= gBitTable[BATTLE_STRUCT->expGetterID]; gBattlescriptCurrInstr = BattleScript_LevelUp; gBattleMoveDamage = (gBattleBufferB[gActiveBank][2] | (gBattleBufferB[gActiveBank][3] << 8)); @@ -6353,7 +6348,7 @@ _080206A8:\n\ movs r0, 0x1\n\ negs r0, r0\n\ strb r0, [r4, 0x5]\n\ - bl b_movescr_stack_push_cursor\n\ + bl BattleScriptPushCursor\n\ ldr r2, _080208D8 @ =gLeveledUpInBattle\n\ ldr r1, _080208DC @ =gBitTable\n\ ldrb r0, [r6]\n\ @@ -7282,7 +7277,7 @@ static void atk3B_healthbar_update(void) static void atk3C_return(void) { - b_movescr_stack_pop_cursor(); + BattleScriptPop(); } static void atk3D_end(void) @@ -7301,7 +7296,7 @@ static void atk3E_end2(void) static void atk3F_end3(void) //pops the main function stack { - b_movescr_stack_pop_cursor(); + BattleScriptPop(); if (B_FUNCTION_STACK->size) B_FUNCTION_STACK->size--; gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; @@ -7309,7 +7304,7 @@ static void atk3F_end3(void) //pops the main function stack static void atk41_call(void) { - b_movescr_stack_push(gBattlescriptCurrInstr + 5); + BattleScriptPush(gBattlescriptCurrInstr + 5); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -7353,7 +7348,7 @@ static void atk45_playanimation(void) } else if (gHitMarker & HITMARKER_NO_ANIMATIONS) { - b_movescr_stack_push(gBattlescriptCurrInstr + 7); + BattleScriptPush(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr = BattleScript_Pausex20; } else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES @@ -7829,7 +7824,7 @@ static void atk49_moveend(void) && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB) { gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RageIsBuilding; effect = 1; } @@ -7843,9 +7838,9 @@ static void atk49_moveend(void) { gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE); gActiveBank = gBankTarget; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); MarkBufferBankForExecution(gActiveBank); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; effect = 1; } @@ -7903,10 +7898,9 @@ static void atk49_moveend(void) } BATTLE_STRUCT->cmd49StateTracker++; break; - //sub_8015660 CheckIfMoveFailed case 9: //semi-invlurneable attacker make visible if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - || sub_8015660(gBankAttacker)) + || WasUnableToUseMove(gBankAttacker)) { gActiveBank = gBankAttacker; EmitSpriteInvisibility(0, 0); @@ -7918,7 +7912,7 @@ static void atk49_moveend(void) break; case 10: //semi-invlurneable target make visible if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - || sub_8015660(gBankTarget)) + || WasUnableToUseMove(gBankTarget)) { gActiveBank = gBankTarget; EmitSpriteInvisibility(0, 0); @@ -8018,7 +8012,7 @@ _08021874:\n\ lsls r0, 2\n\ adds r0, r2\n\ ldr r0, [r0]\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r1, _080218B8 @ =gBattlescriptCurrInstr\n\ ldr r0, _080218BC @ =gUnknown_081D9B2D\n\ bl _0802229C\n\ @@ -8163,7 +8157,7 @@ _080219C8:\n\ bgt _080219FE\n\ adds r0, r2, 0x1\n\ strb r0, [r1, 0x19]\n\ - bl b_movescr_stack_push_cursor\n\ + bl BattleScriptPushCursor\n\ ldr r1, _08021A24 @ =gBattlescriptCurrInstr\n\ ldr r0, _08021A28 @ =BattleScript_RageIsBuilding\n\ str r0, [r1]\n\ @@ -8258,10 +8252,10 @@ _08021A92:\n\ movs r1, 0x28\n\ movs r2, 0\n\ movs r3, 0x4\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r4]\n\ bl MarkBufferBankForExecution\n\ - bl b_movescr_stack_push_cursor\n\ + bl BattleScriptPushCursor\n\ ldr r1, _08021AE8 @ =gBattlescriptCurrInstr\n\ ldr r0, _08021AEC @ =BattleScript_DefrostedViaFireMove\n\ str r0, [r1]\n\ @@ -8571,7 +8565,7 @@ _08021D18:\n\ cmp r0, 0\n\ beq _08021D44\n\ adds r0, r2, 0\n\ - bl sub_8015660\n\ + bl WasUnableToUseMove\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _08021D7E\n\ @@ -10637,7 +10631,7 @@ static void atk52_switchineffects(void) gBattleMoveDamage = 1; BATTLE_STRUCT->scriptingActive = gActiveBank; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) gBattlescriptCurrInstr = BattleScript_SpikesOnTarget; @@ -11457,7 +11451,7 @@ void atk6A_removeitem(void) USED_HELD_ITEMS(gActiveBank) = gBattleMons[gActiveBank].item; gBattleMons[gActiveBank].item = 0; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); + EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; } @@ -11900,7 +11894,7 @@ _08024C48: .4byte gBattlescriptCurrInstr\n\ static void atk6D_resetsentmonsvalue(void) { - sub_80156DC(); + ResetSentPokesToOpponentValue(); gBattlescriptCurrInstr++; } @@ -12148,7 +12142,7 @@ static void atk79_setatkhptozero(void) gActiveBank = gBankAttacker; gBattleMons[gActiveBank].hp = 0; - EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); + EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr++; @@ -12333,7 +12327,7 @@ static void atk81_trysetrest(void) gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleMons[gBankTarget].status1 = 3; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 5; } @@ -12509,7 +12503,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) gBattlescriptCurrInstr = bs_ptr; else { - b_movescr_stack_push(bs_ptr); + BattleScriptPush(bs_ptr); BATTLE_STRUCT->scriptingActive = gActiveBank; gBattlescriptCurrInstr = BattleScript_MistProtected; gSpecialStatuses[gActiveBank].statloweringflag = 1; @@ -12530,7 +12524,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) gBattlescriptCurrInstr = bs_ptr; else { - b_movescr_stack_push(bs_ptr); + BattleScriptPush(bs_ptr); BATTLE_STRUCT->scriptingActive = gActiveBank; gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; gLastUsedAbility = gBattleMons[gActiveBank].ability; @@ -12544,7 +12538,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) { if (flags == 1) { - b_movescr_stack_push(bs_ptr); + BattleScriptPush(bs_ptr); BATTLE_STRUCT->scriptingActive = gActiveBank; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; gLastUsedAbility = gBattleMons[gActiveBank].ability; @@ -12556,7 +12550,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) { if (flags == 1) { - b_movescr_stack_push(bs_ptr); + BattleScriptPush(bs_ptr); BATTLE_STRUCT->scriptingActive = gActiveBank; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; gLastUsedAbility = gBattleMons[gActiveBank].ability; @@ -12774,7 +12768,7 @@ _08025F0C: .4byte gSpecialStatuses\n\ _08025F10: .4byte gBattlescriptCurrInstr\n\ _08025F14:\n\ mov r0, r8\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _08025F40 @ =gSharedMem\n\ ldr r6, _08025F44 @ =gActiveBank\n\ ldrb r1, [r6]\n\ @@ -12869,7 +12863,7 @@ _08025FD8: .4byte gSpecialStatuses\n\ _08025FDC: .4byte gBattlescriptCurrInstr\n\ _08025FE0:\n\ mov r0, r8\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _08026028 @ =gSharedMem\n\ ldr r2, _0802602C @ =gActiveBank\n\ ldrb r1, [r2]\n\ @@ -12926,7 +12920,7 @@ _08026040:\n\ cmp r5, 0x1\n\ bne _08025F74\n\ mov r0, r8\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _08026094 @ =gSharedMem\n\ ldr r3, _08026090 @ =gActiveBank\n\ ldrb r1, [r3]\n\ @@ -12974,7 +12968,7 @@ _080260A8:\n\ b _08025F74\n\ _080260CA:\n\ mov r0, r8\n\ - bl b_movescr_stack_push\n\ + bl BattleScriptPush\n\ ldr r0, _08026100 @ =gSharedMem\n\ ldr r3, _080260FC @ =gActiveBank\n\ ldrb r1, [r3]\n\ @@ -13470,7 +13464,7 @@ static void atk91_givepaydaymoney(void) gBattleTextBuff1[4] = gPaydayMoney; gBattleTextBuff1[5] = uBYTE1_16(gPaydayMoney); gBattleTextBuff1[6] = 0xFF; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); + BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString; } else @@ -14766,7 +14760,7 @@ static void atkA8_copymovepermanently(void) moves_data.pp[i] = gBattleMons[gBankAttacker].pp[i]; } moves_data.ppBonuses = gBattleMons[gBankAttacker].ppBonuses; - EmitSetAttributes(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data); + EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data); MarkBufferBankForExecution(gActiveBank); gBattleTextBuff1[0] = 0xFD; gBattleTextBuff1[1] = 2; @@ -14909,7 +14903,7 @@ static void atkAD_tryspiteppreduce(void) if (!(gDisableStructs[gActiveBank].unk18_b & gBitTable[i]) && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) { - EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]); + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]); MarkBufferBankForExecution(gActiveBank); } gBattlescriptCurrInstr += 5; @@ -14992,7 +14986,7 @@ static void atkAE_healpartystatus(void) } //missing check? gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr++; @@ -15052,7 +15046,7 @@ static void atkB2_trysetperishsong(void) } } - sub_80153D0(gBankAttacker); + PressurePPLoseOnUsingPerishSong(gBankAttacker); if (not_affected_pokes == gNoOfAllBanks) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else @@ -15320,21 +15314,21 @@ static void atkBE_rapidspinfree(void) //rapid spin gBattleTextBuff1[2] = ewram16004arr(0, gBankAttacker); gBattleTextBuff1[3] = ewram16004arr(1, gBankAttacker); gBattleTextBuff1[4] = 0xFF; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WrapFree; } else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED) { gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED); gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK); - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_LeechSeedFree; } else if (gSideAffecting[GetBankSide(gBankAttacker)] & SIDE_STATUS_SPIKES) { gSideAffecting[GetBankSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES); gSideTimers[GetBankSide(gBankAttacker)].spikesAmount = 0; - b_movescr_stack_push_cursor(); + BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SpikesFree; } else @@ -15952,7 +15946,7 @@ static void atkCC_callterrainattack(void) //nature power gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); gCurrentMove = sNaturePowerMoves[gBattleTerrain]; gBankTarget = GetMoveTarget(gCurrentMove, 0); - b_movescr_stack_push(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); + BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); gBattlescriptCurrInstr++; } @@ -15963,7 +15957,7 @@ static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh gBattleMons[gBankAttacker].status1 = 0; gBattlescriptCurrInstr += 5; gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); } else @@ -16222,7 +16216,7 @@ _0802A36C:\n\ movs r1, 0x2\n\ movs r2, 0\n\ movs r3, 0x2\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldr r2, _0802A45C @ =gBankAttacker\n\ ldrb r0, [r2]\n\ bl MarkBufferBankForExecution\n\ @@ -16240,7 +16234,7 @@ _0802A36C:\n\ movs r1, 0x2\n\ movs r2, 0\n\ movs r3, 0x2\n\ - bl EmitSetAttributes\n\ + bl EmitSetMonData\n\ ldrb r0, [r7]\n\ bl MarkBufferBankForExecution\n\ ldr r0, _0802A464 @ =0xfffe9f10\n\ @@ -16471,7 +16465,7 @@ static void atkDB_tryimprision(void) else { u8 bank; - sub_801529C(gBankAttacker); + PressurePPLoseOnUsingImprision(gBankAttacker); for (bank = 0; bank < gNoOfAllBanks; bank++) { if (r8 != GetBankSide(bank)) @@ -16826,7 +16820,7 @@ static void atkE2_switchoutabilities(void) { case ABILITY_NATURAL_CURE: gBattleMons[gActiveBank].status1 = 0; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, gBitTable[ewram16064arr(gActiveBank)], 4, &gBattleMons[gActiveBank].status1); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[ewram16064arr(gActiveBank)], 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); break; } @@ -16922,7 +16916,7 @@ static void atkE7_trycastformdatachange(void) form = CastformDataTypeChange(BATTLE_STRUCT->scriptingActive); if (form) { - b_push_move_exec(BattleScript_CastformChange); + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); BATTLE_STRUCT->castformToChangeInto = form - 1; } } @@ -16984,7 +16978,7 @@ static void atkEA_tryrecycleitem(void) gLastUsedItem = *used_item; *used_item = 0; gBattleMons[gActiveBank].item = gLastUsedItem; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); + EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 5; } diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c new file mode 100644 index 000000000..9dc030a1a --- /dev/null +++ b/src/battle/battle_util.c @@ -0,0 +1,3479 @@ +#include "global.h" +#include "battle.h" +#include "battle_util.h" +#include "data2.h" +#include "event_data.h" +#include "ewram.h" +#include "item.h" +#include "link.h" +#include "pokemon.h" +#include "random.h" +#include "rom_8077ABC.h" +#include "string_util.h" +#include "text.h" +#include "util.h" +#include "constants/abilities.h" +#include "constants/battle_move_effects.h" +#include "constants/flags.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "constants/weather.h" + +extern u8* gBattlescriptCurrInstr; +extern u8 gActiveBank; +extern u8 gBattleBufferB[4][0x200]; +extern u8* gUnknown_02024C1C[4]; //battlescript location when you try to choose a move you're not allowed to +extern u16 gLastUsedMove[4]; +extern struct BattlePokemon gBattleMons[4]; +extern struct BattleEnigmaBerry gEnigmaBerries[4]; +extern u8 gStringBank; +extern u16 gLastUsedItem; +extern u16 gCurrentMove; +extern const u32 gBitTable[]; +extern u16 gBattleTypeFlags; +extern u8 gNoOfAllBanks; +extern u32 gStatuses3[4]; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gBanksByTurnOrder[4]; +extern u16 gSideAffecting[2]; +extern u16 gBattleWeather; +extern void (*gBattleMainFunc)(void); +extern u8 gAbsentBankFlags; +extern u8 gBattleCommunication[]; +extern u32 gHitMarker; +extern u8 gEffectBank; +extern u8 gBank1; +extern s32 gBattleMoveDamage; +extern u16 gBattlePartyID[4]; +extern u16 gChosenMovesByBanks[4]; +extern s32 gTakenDmg[4]; +extern u8 gTakenDmgBanks[4]; +extern u8 gBattleMoveFlags; +extern u8 gLastUsedAbility; +extern u8 gBattleTextBuff2[]; +extern u8 gCurrentActionFuncId; +extern struct BattleEnigmaBerry gEnigmaBerries[4]; +extern u8 gUnknown_02024BE5; +extern u8 gCurrMovePos; +extern u16 gRandomMove; +extern s32 gBattleMoveDamage; +extern u16 gDynamicBasePower; +extern u32 gBattleExecBuffer; +extern u8 gSentPokesToOpponent[2]; +extern const u16 gSoundMovesTable[]; +extern const u8 gStatusConditionString_PoisonJpn[]; +extern const u8 gStatusConditionString_SleepJpn[]; +extern const u8 gStatusConditionString_ParalysisJpn[]; +extern const u8 gStatusConditionString_BurnJpn[]; +extern const u8 gStatusConditionString_IceJpn[]; +extern const u8 gStatusConditionString_ConfusionJpn[]; +extern const u8 gStatusConditionString_LoveJpn[]; +extern const BattleCmdFunc gBattleScriptingCommandsTable[]; + +u8 IsImprisoned(u8 bank, u16 move); +u8 GetBankByIdentity(u8 ID); +u8 GetBankIdentity(u8 bank); +u8 GetBankSide(u8 bank); +void SetMoveEffect(bool8 primary, u8 certainArg); +bool8 UproarWakeUpCheck(u8 bank); +bool8 sub_8018018(u8 bank, u8, u8); +s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); +u8 CountTrailingZeroBits(u32 a); +u8 GetMoveTarget(u16 move, u8 useMoveTarget); +u8 sub_803FC34(u8 bank); +u16 sub_803FBFC(u8 a); +u8 weather_get_current(void); +void RecordAbilityBattle(u8 bank, u8 ability); +void RecordItemBattle(u8 bank, u8 holdEffect); +s8 GetPokeFlavourRelation(u32 pid, u8 flavor); + +extern u8 BattleScript_MoveSelectionDisabledMove[]; +extern u8 BattleScript_MoveSelectionTormented[]; +extern u8 BattleScript_MoveSelectionTaunted[]; +extern u8 BattleScript_MoveSelectionImprisoned[]; +extern u8 BattleScript_MoveSelectionChoiceBanded[]; +extern u8 BattleScript_MoveSelectionNoPP[]; +extern u8 BattleScript_NoMovesLeft[]; +extern u8 BattleScript_WishComesTrue[]; +extern u8 BattleScript_IngrainTurnHeal[]; +extern u8 BattleScript_LeechSeedTurnDrain[]; +extern u8 BattleScript_PoisonTurnDmg[]; +extern u8 BattleScript_BurnTurnDmg[]; +extern u8 BattleScript_NightmareTurnDmg[]; +extern u8 BattleScript_CurseTurnDmg[]; +extern u8 BattleScript_WrapTurnDmg[]; +extern u8 BattleScript_WrapEnds[]; +extern u8 BattleScript_DisabledNoMore[]; +extern u8 BattleScript_EncoredNoMore[]; + +extern u8 BattleScript_SideStatusWoreOff[]; +extern u8 BattleScript_RainContinuesOrEnds[]; +extern u8 BattleScript_SandStormHailEnds[]; +extern u8 BattleScript_DamagingWeatherContinues[]; +extern u8 BattleScript_SunlightFaded[]; +extern u8 BattleScript_SunlightContinues[]; +extern u8 BattleScript_SafeguardEnds[]; +extern u8 BattleScript_MonWokeUpInUproar[]; //uproar wakeup BS +extern u8 BattleScript_PrintUproarOverTurns[]; //uproar BS +extern u8 BattleScript_ThrashConfuses[]; +extern u8 BattleScript_YawnMakesAsleep[]; +extern u8 BattleScript_MonTookFutureAttack[]; +extern u8 BattleScript_PerishSongHits[]; +extern u8 BattleScript_PerishSongTimerGoesDown[]; +extern u8 BattleScript_GiveExp[]; +extern u8 BattleScript_HandleFaintedMon[]; + +extern u8 BattleScript_MoveUsedIsAsleep[]; +extern u8 BattleScript_MoveUsedWokeUp[]; +extern u8 BattleScript_MoveUsedIsFrozen[]; +extern u8 BattleScript_MoveUsedUnfroze[]; +extern u8 BattleScript_MoveUsedLoafingAround[]; +extern u8 BattleScript_MoveUsedMustRecharge[]; +extern u8 BattleScript_MoveUsedFlinched[]; +extern u8 BattleScript_MoveUsedIsDisabled[]; +extern u8 BattleScript_MoveUsedIsTaunted[]; +extern u8 BattleScript_MoveUsedIsImprisoned[]; +extern u8 BattleScript_MoveUsedIsConfused[]; +extern u8 BattleScript_MoveUsedIsConfusedNoMore[]; +extern u8 BattleScript_MoveUsedIsParalyzed[]; +extern u8 BattleScript_MoveUsedIsParalyzedCantAttack[]; +extern u8 BattleScript_MoveUsedIsInLove[]; +extern u8 BattleScript_BideStoringEnergy[]; +extern u8 BattleScript_BideAttack[]; +extern u8 BattleScript_BideNoEnergyToAttack[]; + +extern u8 BattleScript_OverworldWeatherStarts[]; //load weather from overworld +extern u8 BattleScript_DrizzleActivates[]; +extern u8 BattleScript_SandstreamActivates[]; +extern u8 BattleScript_DroughtActivates[]; +extern u8 BattleScript_CastformChange[]; +extern u8 BattleScript_RainDishActivates[]; +extern u8 BattleScript_ShedSkinActivates[]; +extern u8 BattleScript_SpeedBoostActivates[]; +extern u8 BattleScript_SoundproofProtected[]; +extern u8 BattleScript_MoveHPDrain[]; +extern u8 BattleScript_MoveHPDrain_PPLoss[]; +extern u8 BattleScript_FlashFireBoost[]; +extern u8 BattleScript_FlashFireBoost_PPLoss[]; +extern u8 BattleScript_MoveHPDrain_FullHP[]; +extern u8 BattleScript_MoveHPDrain_FullHP_PPLoss[]; +extern u8 BattleScript_ColorChangeActivates[]; +extern u8 BattleScript_RoughSkinActivates[]; +extern u8 BattleScript_ApplySecondaryEffect[]; +extern u8 BattleScript_CuteCharmActivates[]; +extern u8 BattleScript_AbilityCuredStatus[]; //ability status clear +extern u8 BattleScript_SynchronizeActivates[]; +extern u8 gUnknown_081D978C[]; //intimidate1 +extern u8 gUnknown_081D9795[]; //intimidate2 +extern u8 BattleScript_TraceActivates[]; + +extern u8 BattleScript_WhiteHerbEnd2[]; +extern u8 BattleScript_WhiteHerbRet[]; +extern u8 BattleScript_ItemHealHP_RemoveItem[]; +extern u8 BattleScript_BerryPPHealEnd2[]; +extern u8 BattleScript_ItemHealHP_End2[]; +extern u8 BattleScript_BerryConfuseHealEnd2[]; +extern u8 BattleScript_BerryStatRaiseEnd2[]; +extern u8 BattleScript_BerryFocusEnergyEnd2[]; +extern u8 BattleScript_BerryCurePrlzEnd2[]; +extern u8 BattleScript_BerryCurePsnEnd2[]; +extern u8 BattleScript_BerryCureBrnEnd2[]; +extern u8 BattleScript_BerryCureFrzEnd2[]; +extern u8 BattleScript_BerryCureSlpEnd2[]; +extern u8 BattleScript_BerryCureConfusionEnd2[]; +extern u8 BattleScript_BerryCureChosenStatusEnd2[]; //berry cure any status end2 +extern u8 BattleScript_BerryCureParRet[]; +extern u8 BattleScript_BerryCurePsnRet[]; +extern u8 BattleScript_BerryCureBrnRet[]; +extern u8 BattleScript_BerryCureFrzRet[]; +extern u8 BattleScript_BerryCureSlpRet[]; +extern u8 BattleScript_BerryCureConfusionRet[]; +extern u8 BattleScript_BerryCureChosenStatusRet[]; //berry cure any status return + +extern u8 BattleScript_ItemHealHP_Ret[]; + +extern u8 gUnknown_081D995F[]; //disobedient while asleep +extern u8 BattleScript_IgnoresAndUsesRandomMove[]; //disobedient, uses a random move +extern u8 BattleScript_IgnoresAndFallsAsleep[]; //disobedient, went to sleep +extern u8 gUnknown_081D99A0[]; //disobedient, hits itself + +//array entries for battle communication +#define MOVE_EFFECT_BYTE 0x3 +#define MULTISTRING_CHOOSER 0x5 +#define MSG_DISPLAY 0x7 + +u8 GetBattleBank(u8 caseId) +{ + u8 ret = 0; + switch (caseId) + { + case BS_GET_TARGET: + ret = gBankTarget; + break; + case BS_GET_ATTACKER: + ret = gBankAttacker; + break; + case BS_GET_EFFECT_BANK: + ret = gEffectBank; + break; + case BS_GET_BANK_0: + ret = 0; + break; + case BS_GET_SCRIPTING_BANK: + ret = ewram16003; + break; + case BS_GET_gBank1: + ret = gBank1; + break; + case 5: + ret = gBank1; + break; + } + return ret; +} + +void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move) +{ + s32 i; + + if (gBattleMons[bankDef].ability != ABILITY_PRESSURE) + return; + + for (i = 0; i < 4; i++) + { + if (gBattleMons[bankAtk].moves[i] == move) + break; + } + + if (i == 4) // mons don't share any moves + return; + + if (gBattleMons[bankAtk].pp[i] != 0) + gBattleMons[bankAtk].pp[i]--; + + if (!(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) + && !(gDisableStructs[bankAtk].unk18_b & gBitTable[i])) + { + gActiveBank = bankAtk; + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]); + MarkBufferBankForExecution(gActiveBank); + } +} + +void PressurePPLoseOnUsingImprision(u8 bankAtk) +{ + s32 i, j; + s32 imprisionPos = 4; + u8 atkSide = GetBankSide(bankAtk); + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (atkSide != GetBankSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE) + { + for (j = 0; j < 4; j++) + { + if (gBattleMons[bankAtk].moves[j] == MOVE_IMPRISON) + break; + } + if (j != 4) + { + imprisionPos = j; + if (gBattleMons[bankAtk].pp[j] != 0) + gBattleMons[bankAtk].pp[j]--; + } + } + } + + if (imprisionPos != 4 + && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) + && !(gDisableStructs[bankAtk].unk18_b & gBitTable[imprisionPos])) + { + gActiveBank = bankAtk; + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + imprisionPos, 0, 1, &gBattleMons[gActiveBank].pp[imprisionPos]); + MarkBufferBankForExecution(gActiveBank); + } +} + +void PressurePPLoseOnUsingPerishSong(u8 bankAtk) +{ + s32 i, j; + s32 perishSongPos = 4; + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ABILITY_PRESSURE && i != bankAtk) + { + for (j = 0; j < 4; j++) + { + if (gBattleMons[bankAtk].moves[j] == MOVE_PERISH_SONG) + break; + } + if (j != 4) + { + perishSongPos = j; + if (gBattleMons[bankAtk].pp[j] != 0) + gBattleMons[bankAtk].pp[j]--; + } + } + } + + if (perishSongPos != 4 + && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED) + && !(gDisableStructs[bankAtk].unk18_b & gBitTable[perishSongPos])) + { + gActiveBank = bankAtk; + EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBank].pp[perishSongPos]); + MarkBufferBankForExecution(gActiveBank); + } +} + + +void MarkAllBufferBanksForExecution(void) // unused +{ + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + for (i = 0; i < gNoOfAllBanks; i++) + gBattleExecBuffer |= gBitTable[i] << 0x1C; + } + else + { + for (i = 0; i < gNoOfAllBanks; i++) + gBattleExecBuffer |= gBitTable[i]; + } +} + +void MarkBufferBankForExecution(u8 bank) +{ + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gBattleExecBuffer |= gBitTable[bank] << 0x1C; + } + else + { + gBattleExecBuffer |= gBitTable[bank]; + } +} + +void sub_80155A4(u8 arg0) +{ + s32 i; + + for (i = 0; i < GetLinkPlayerCount(); i++) + gBattleExecBuffer |= gBitTable[arg0] << (i << 2); + + gBattleExecBuffer &= ~(0x10000000 << arg0); +} + +void CancelMultiTurnMoves(u8 bank) +{ + gBattleMons[bank].status2 &= ~(STATUS2_MULTIPLETURNS); + gBattleMons[bank].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[bank].status2 &= ~(STATUS2_UPROAR); + gBattleMons[bank].status2 &= ~(STATUS2_BIDE); + + gStatuses3[bank] &= ~(STATUS3_SEMI_INVULNERABLE); + + gDisableStructs[bank].rolloutTimer1 = 0; + gDisableStructs[bank].furyCutterCounter = 0; +} + +bool8 WasUnableToUseMove(u8 bank) +{ + if (gProtectStructs[bank].prlzImmobility + || gProtectStructs[bank].notEffective + || gProtectStructs[bank].usedImprisionedMove + || gProtectStructs[bank].loveImmobility + || gProtectStructs[bank].usedDisabledMove + || gProtectStructs[bank].usedTauntedMove + || gProtectStructs[bank].flag2Unknown + || gProtectStructs[bank].flinchImmobility + || gProtectStructs[bank].confusionSelfDmg) + return TRUE; + else + return FALSE; +} + +void PrepareStringBattle(u16 stringId, u8 bank) +{ + gActiveBank = bank; + EmitPrintString(0, stringId); + MarkBufferBankForExecution(gActiveBank); +} + +void ResetSentPokesToOpponentValue(void) +{ + s32 i; + u32 bits = 0; + + gSentPokesToOpponent[0] = 0; + gSentPokesToOpponent[1] = 0; + + for (i = 0; i < gNoOfAllBanks; i += 2) + bits |= gBitTable[gBattlePartyID[i]]; + + for (i = 1; i < gNoOfAllBanks; i += 2) + gSentPokesToOpponent[(i & BIT_MON) >> 1] = bits; +} + +void sub_8015740(u8 bank) +{ + s32 i = 0; + u32 bits = 0; + + if (GetBankSide(bank) == SIDE_OPPONENT) + { + u8 id = ((bank & BIT_MON) >> 1); + gSentPokesToOpponent[id] = 0; + + for (i = 0; i < gNoOfAllBanks; i += 2) + { + if (!(gAbsentBankFlags & gBitTable[i])) + bits |= gBitTable[gBattlePartyID[i]]; + } + + gSentPokesToOpponent[id] = bits; + } +} + +void sub_80157C4(u8 bank) +{ + if (GetBankSide(bank) == SIDE_OPPONENT) + { + sub_8015740(bank); + } + else + { + s32 i; + for (i = 1; i < gNoOfAllBanks; i++) + gSentPokesToOpponent[(i & BIT_MON) >> 1] |= gBitTable[gBattlePartyID[bank]]; + } +} + +void BattleScriptPush(u8* BS_ptr) +{ + B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = BS_ptr; +} + +void BattleScriptPushCursor(void) +{ + B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = gBattlescriptCurrInstr; +} + +void BattleScriptPop(void) +{ + gBattlescriptCurrInstr = B_BATTLESCRIPTS_STACK->ptr[--B_BATTLESCRIPTS_STACK->size]; +} + +u8 TrySetCantSelectMoveBattleScript(void) //msg can't select a move +{ + u8 limitations = 0; + u16 move = gBattleMons[gActiveBank].moves[gBattleBufferB[gActiveBank][2]]; + u8 holdEffect; + u16* choicedMove = CHOICED_MOVE(gActiveBank); + if (gDisableStructs[gActiveBank].disabledMove == move && move) + { + BATTLE_STRUCT->scriptingActive = gActiveBank; + gCurrentMove = move; + gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionDisabledMove; + limitations++; + } + if (move == gLastUsedMove[gActiveBank] && move != MOVE_STRUGGLE && gBattleMons[gActiveBank].status2 & STATUS2_TORMENT) + { + CancelMultiTurnMoves(gActiveBank); + gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionTormented; + limitations++; + } + if (gDisableStructs[gActiveBank].tauntTimer1 && gBattleMoves[move].power == 0) + { + gCurrentMove = move; + gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionTaunted; + limitations++; + } + if (IsImprisoned(gActiveBank, move)) + { + gCurrentMove = move; + gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionImprisoned; + limitations++; + } + if (gBattleMons[gActiveBank].item == ITEM_ENIGMA_BERRY) + holdEffect = gEnigmaBerries[gActiveBank].holdEffect; + else + holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBank].item); + gStringBank = gActiveBank; + if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move) + { + gCurrentMove = *choicedMove; + gLastUsedItem = gBattleMons[gActiveBank].item; + gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionChoiceBanded; + limitations++; + } + if (gBattleMons[gActiveBank].pp[gBattleBufferB[gActiveBank][2]] == 0) + { + gUnknown_02024C1C[gActiveBank] = BattleScript_MoveSelectionNoPP; + limitations++; + } + return limitations; +} + +#define MOVE_LIMITATION_ZEROMOVE (1 << 0) +#define MOVE_LIMITATION_PP (1 << 1) +#define MOVE_LIMITATION_DISABLED (1 << 2) +#define MOVE_LIMITATION_TORMENTED (1 << 3) +#define MOVE_LIMITATION_TAUNT (1 << 4) +#define MOVE_LIMITATION_IMPRISION (1 << 5) + +u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check) +{ + u8 holdEffect; + u16* choicedMove = CHOICED_MOVE(bank); + s32 i; + if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) + holdEffect = gEnigmaBerries[bank].holdEffect; + else + holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item); + gStringBank = bank; + for (i = 0; i < 4; i++) + { + if (gBattleMons[bank].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE) + unusableMoves |= gBitTable[i]; + if (gBattleMons[bank].pp[i] == 0 && check & MOVE_LIMITATION_PP) + unusableMoves |= gBitTable[i]; + if (gBattleMons[bank].moves[i] == gDisableStructs[bank].disabledMove && check & MOVE_LIMITATION_DISABLED) + unusableMoves |= gBitTable[i]; + if (gBattleMons[bank].moves[i] == gLastUsedMove[bank] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[bank].status2 & STATUS2_TORMENT) + unusableMoves |= gBitTable[i]; + if (gDisableStructs[bank].tauntTimer1 && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[bank].moves[i]].power == 0) + unusableMoves |= gBitTable[i]; + if (IsImprisoned(bank, gBattleMons[bank].moves[i]) && check & MOVE_LIMITATION_IMPRISION) + unusableMoves |= gBitTable[i]; + if (gDisableStructs[bank].encoreTimer1 && gDisableStructs[bank].encoredMove != gBattleMons[bank].moves[i]) + unusableMoves |= gBitTable[i]; + if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[bank].moves[i]) + unusableMoves |= gBitTable[i]; + } + return unusableMoves; +} + +bool8 AreAllMovesUnusable(void) +{ + u8 unusable; + unusable = CheckMoveLimitations(gActiveBank, 0, 0xFF); + if (unusable == 0xF) //all moves are unusable + { + gProtectStructs[gActiveBank].onlyStruggle = 1; + gUnknown_02024C1C[gActiveBank] = BattleScript_NoMovesLeft; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + gBattleBufferB[gActiveBank][3] = GetBankByIdentity((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2)); + else + gBattleBufferB[gActiveBank][3] = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ 1); + } + else + gProtectStructs[gActiveBank].onlyStruggle = 0; + return (unusable == 0xF); +} + +u8 IsImprisoned(u8 bank, u16 move) +{ + u8 imprisionedMoves = 0; + u8 bankSide = GetBankSide(bank); + s32 i; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (bankSide != GetBankSide(i) && gStatuses3[i] & STATUS3_IMPRISIONED) + { + s32 j; + for (j = 0; j < 4; j++) + { + if (move == gBattleMons[i].moves[j]) + break; + } + if (j < 4) + imprisionedMoves++; + } + } + return imprisionedMoves; +} + +u8 UpdateTurnCounters(void) +{ + u8 effect = 0; + s32 i; + + for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankAttacker]; gBankAttacker++) + { + } + for (gBankTarget = 0; gBankTarget < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankTarget]; gBankTarget++) + { + } + + do + { + u8 sideBank; + + switch (BATTLE_STRUCT->turncountersTracker) + { + case 0: + for (i = 0; i < gNoOfAllBanks; i++) + { + gBanksByTurnOrder[i] = i; + } + for (i = 0; i < gNoOfAllBanks - 1; i++) + { + s32 j; + for (j = i + 1; j < gNoOfAllBanks; j++) + { + if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 0)) + SwapTurnOrder(i, j); + } + } + BATTLE_STRUCT->turncountersTracker++; + BATTLE_STRUCT->turnSideTracker = 0; + case 1: + while (BATTLE_STRUCT->turnSideTracker < 2) + { + gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; + + if (gSideAffecting[sideBank] & SIDE_STATUS_REFLECT) + { + if (--gSideTimers[sideBank].reflectTimer == 0) + { + + gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = MOVE_REFLECT; + gBattleTextBuff1[3] = MOVE_REFLECT >> 8; + gBattleTextBuff1[4] = EOS; + effect++; + } + } + BATTLE_STRUCT->turnSideTracker++; + if (effect) + break; + } + if (!effect) + { + BATTLE_STRUCT->turncountersTracker++; + BATTLE_STRUCT->turnSideTracker = 0; + } + break; + case 2: + while (BATTLE_STRUCT->turnSideTracker < 2) + { + gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; + if (gSideAffecting[sideBank] & SIDE_STATUS_LIGHTSCREEN) + { + if (--gSideTimers[sideBank].lightscreenTimer == 0) + { + gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = MOVE_LIGHT_SCREEN; + gBattleTextBuff1[3] = MOVE_LIGHT_SCREEN >> 8; + gBattleTextBuff1[4] = EOS; + effect++; + } + } + BATTLE_STRUCT->turnSideTracker++; + if (effect) + break; + } + if (!effect) + { + BATTLE_STRUCT->turncountersTracker++; + BATTLE_STRUCT->turnSideTracker = 0; + } + break; + case 3: + while (BATTLE_STRUCT->turnSideTracker < 2) + { + gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; + if (gSideTimers[sideBank].mistTimer && --gSideTimers[sideBank].mistTimer == 0) + { + gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = MOVE_MIST; + gBattleTextBuff1[3] = MOVE_MIST >> 8; + gBattleTextBuff1[4] = EOS; + effect++; + } + BATTLE_STRUCT->turnSideTracker++; + if (effect) + break; + } + if (!effect) + { + BATTLE_STRUCT->turncountersTracker++; + BATTLE_STRUCT->turnSideTracker = 0; + } + break; + case 4: + while (BATTLE_STRUCT->turnSideTracker < 2) + { + gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker; + if (gSideAffecting[sideBank] & SIDE_STATUS_SAFEGUARD) + { + if (--gSideTimers[sideBank].safeguardTimer == 0) + { + gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD; + BattleScriptExecute(BattleScript_SafeguardEnds); + effect++; + } + } + BATTLE_STRUCT->turnSideTracker++; + if (effect) + break; + } + if (!effect) + { + BATTLE_STRUCT->turncountersTracker++; + BATTLE_STRUCT->turnSideTracker = 0; + } + break; + case 5: + while (BATTLE_STRUCT->turnSideTracker < gNoOfAllBanks) + { + gActiveBank = gBanksByTurnOrder[BATTLE_STRUCT->turnSideTracker]; + if (gWishFutureKnock.wishCounter[gActiveBank] && --gWishFutureKnock.wishCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp) + { + gBankTarget = gActiveBank; + BattleScriptExecute(BattleScript_WishComesTrue); + effect++; + } + BATTLE_STRUCT->turnSideTracker++; + if (effect) + break; + } + if (!effect) + { + BATTLE_STRUCT->turncountersTracker++; + } + break; + case 6: + if (gBattleWeather & WEATHER_RAIN_ANY) + { + if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) + { + if (--gWishFutureKnock.weatherDuration == 0) + { + gBattleWeather &= ~WEATHER_RAIN_TEMPORARY; + gBattleWeather &= ~WEATHER_RAIN_DOWNPOUR; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + BattleScriptExecute(BattleScript_RainContinuesOrEnds); + effect++; + } + BATTLE_STRUCT->turncountersTracker++; + break; + case 7: + if (gBattleWeather & WEATHER_SANDSTORM_ANY) + { + if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) + { + gBattleWeather &= ~WEATHER_SANDSTORM_TEMPORARY; + gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; + } + else + gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; + + BATTLE_STRUCT->animArg1 = B_ANIM_SANDSTORM_CONTINUES; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + BattleScriptExecute(gBattlescriptCurrInstr); + effect++; + } + BATTLE_STRUCT->turncountersTracker++; + break; + case 8: + if (gBattleWeather & WEATHER_SUN_ANY) + { + if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) + { + gBattleWeather &= ~WEATHER_SUN_TEMPORARY; + gBattlescriptCurrInstr = BattleScript_SunlightFaded; + } + else + gBattlescriptCurrInstr = BattleScript_SunlightContinues; + + BattleScriptExecute(gBattlescriptCurrInstr); + effect++; + } + BATTLE_STRUCT->turncountersTracker++; + break; + case 9: + if (gBattleWeather & WEATHER_HAIL) + { + if (--gWishFutureKnock.weatherDuration == 0) + { + gBattleWeather &= ~WEATHER_HAIL; + gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; + } + else + gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; + + BATTLE_STRUCT->animArg1 = B_ANIM_HAIL_CONTINUES; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + BattleScriptExecute(gBattlescriptCurrInstr); + effect++; + } + BATTLE_STRUCT->turncountersTracker++; + break; + case 10: + effect++; + break; + } + } while (effect == 0); + return (gBattleMainFunc != BattleTurnPassed); +} + +#define TURNBASED_MAX_CASE 19 + +u8 TurnBasedEffects(void) +{ + u8 effect = 0; + + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); + while (BATTLE_STRUCT->turnEffectsBank < gNoOfAllBanks && BATTLE_STRUCT->turnEffectsTracker <= TURNBASED_MAX_CASE) + { + gActiveBank = gBankAttacker = gBanksByTurnOrder[BATTLE_STRUCT->turnEffectsBank]; + if (gAbsentBankFlags & gBitTable[gActiveBank]) + { + BATTLE_STRUCT->turnEffectsBank++; + } + else + { + switch (BATTLE_STRUCT->turnEffectsTracker) + { + case 0: // ingrain + if ((gStatuses3[gActiveBank] & STATUS3_ROOTED) + && gBattleMons[gActiveBank].hp != gBattleMons[gActiveBank].maxHP + && gBattleMons[gActiveBank].hp != 0) + { + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + BattleScriptExecute(BattleScript_IngrainTurnHeal); + effect++; + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 1: // end turn abilities + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBank, 0, 0, 0)) + effect++; + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 2: // item effects + if (ItemBattleEffects(1, gActiveBank, 0)) + effect++; + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 18: // item effects again + if (ItemBattleEffects(1, gActiveBank, 1)) + effect++; + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 3: // leech seed + if (gStatuses3[gActiveBank] & STATUS3_LEECHSEED && gBattleMons[gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK].hp != 0 && gBattleMons[gActiveBank].hp != 0) + { + gBankTarget = gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK; //funny how the 'target' is actually the bank that receives HP + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BATTLE_STRUCT->animArg1 = gBankTarget; + BATTLE_STRUCT->animArg2 = gBankAttacker; + BattleScriptExecute(BattleScript_LeechSeedTurnDrain); + effect++; + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 4: // poison + if ((gBattleMons[gActiveBank].status1 & STATUS_POISON) && gBattleMons[gActiveBank].hp != 0) + { + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptExecute(BattleScript_PoisonTurnDmg); + effect++; + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 5: // toxic poison + if ((gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON) && gBattleMons[gActiveBank].hp != 0) + { + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if ((gBattleMons[gActiveBank].status1 & 0xF00) != 0xF00) //not 16 turns + gBattleMons[gActiveBank].status1 += 0x100; + gBattleMoveDamage *= (gBattleMons[gActiveBank].status1 & 0xF00) >> 8; + BattleScriptExecute(BattleScript_PoisonTurnDmg); + effect++; + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 6: // burn + if ((gBattleMons[gActiveBank].status1 & STATUS_BURN) && gBattleMons[gActiveBank].hp != 0) + { + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptExecute(BattleScript_BurnTurnDmg); + effect++; + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 7: // spooky nightmares + if ((gBattleMons[gActiveBank].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBank].hp != 0) + { + // missing sleep check + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptExecute(BattleScript_NightmareTurnDmg); + effect++; + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 8: // curse + if ((gBattleMons[gActiveBank].status2 & STATUS2_CURSED) && gBattleMons[gActiveBank].hp != 0) + { + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptExecute(BattleScript_CurseTurnDmg); + effect++; + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 9: // wrap + if ((gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBank].hp != 0) + { + gBattleMons[gActiveBank].status2 -= 0x2000; + if (gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) // damaged by wrap + { + BATTLE_STRUCT->animArg1 = ewram16004arr(0, gActiveBank); + BATTLE_STRUCT->animArg2 = ewram16004arr(1, gActiveBank); + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = ewram16004arr(0, gActiveBank); + gBattleTextBuff1[3] = ewram16004arr(1, gActiveBank); + gBattleTextBuff1[4] = EOS; + gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + } + else // broke free + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = ewram16004arr(0, gActiveBank); + gBattleTextBuff1[3] = ewram16004arr(1, gActiveBank); + gBattleTextBuff1[4] = EOS; + gBattlescriptCurrInstr = BattleScript_WrapEnds; + } + BattleScriptExecute(gBattlescriptCurrInstr); + effect++; + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 10: // uproar + if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR) + { + for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks; gBankAttacker++) + { + if ((gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) + && gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF) + { + gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + BattleScriptExecute(BattleScript_MonWokeUpInUproar); + gActiveBank = gBankAttacker; + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + break; + } + } + if (gBankAttacker != gNoOfAllBanks) + { + effect = 2; // a pokemon was awaken + break; + } + else + { + gBankAttacker = gActiveBank; + gBattleMons[gActiveBank].status2 -= 0x10; // uproar timer goes down + if (WasUnableToUseMove(gActiveBank)) + { + CancelMultiTurnMoves(gActiveBank); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleMons[gActiveBank].status2 |= STATUS2_MULTIPLETURNS; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + CancelMultiTurnMoves(gActiveBank); + } + BattleScriptExecute(BattleScript_PrintUproarOverTurns); + effect = 1; + } + } + if (effect != 2) + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 11: // thrash + if (gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE) + { + gBattleMons[gActiveBank].status2 -= 0x400; + if (WasUnableToUseMove(gActiveBank)) + CancelMultiTurnMoves(gActiveBank); + else if (!(gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE) + && (gBattleMons[gActiveBank].status2 & STATUS2_MULTIPLETURNS)) + { + gBattleMons[gActiveBank].status2 &= ~(STATUS2_MULTIPLETURNS); + if (!(gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x47; + SetMoveEffect(1, 0); + if (gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION) + BattleScriptExecute(BattleScript_ThrashConfuses); + effect++; + } + } + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 12: // disable + if (gDisableStructs[gActiveBank].disableTimer1 != 0) + { + int i; + for (i = 0; i < 4; i++) + { + if (gDisableStructs[gActiveBank].disabledMove == gBattleMons[gActiveBank].moves[i]) + break; + } + if (i == 4) // pokemon does not have the disabled move anymore + { + gDisableStructs[gActiveBank].disabledMove = 0; + gDisableStructs[gActiveBank].disableTimer1 = 0; + } + else if (--gDisableStructs[gActiveBank].disableTimer1 == 0) // disable ends + { + gDisableStructs[gActiveBank].disabledMove = 0; + BattleScriptExecute(BattleScript_DisabledNoMore); + effect++; + } + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 13: // encore + if (gDisableStructs[gActiveBank].encoreTimer1 != 0) + { + if (gBattleMons[gActiveBank].moves[gDisableStructs[gActiveBank].encoredMovePos] != gDisableStructs[gActiveBank].encoredMove) // pokemon does not have the encored move anymore + { + gDisableStructs[gActiveBank].encoredMove = 0; + gDisableStructs[gActiveBank].encoreTimer1 = 0; + } + else if (--gDisableStructs[gActiveBank].encoreTimer1 == 0 + || gBattleMons[gActiveBank].pp[gDisableStructs[gActiveBank].encoredMovePos] == 0) + { + gDisableStructs[gActiveBank].encoredMove = 0; + gDisableStructs[gActiveBank].encoreTimer1 = 0; + BattleScriptExecute(BattleScript_EncoredNoMore); + effect++; + } + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 14: // lock-on decrement + if (gStatuses3[gActiveBank] & STATUS3_ALWAYS_HITS) + gStatuses3[gActiveBank] -= 0x8; + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 15: // charge + if (gDisableStructs[gActiveBank].chargeTimer1 && --gDisableStructs[gActiveBank].chargeTimer1 == 0) + gStatuses3[gActiveBank] &= ~STATUS3_CHARGED_UP; + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 16: // taunt + if (gDisableStructs[gActiveBank].tauntTimer1) + gDisableStructs[gActiveBank].tauntTimer1--; + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 17: // yawn + if (gStatuses3[gActiveBank] & STATUS3_YAWN) + { + gStatuses3[gActiveBank] -= 0x800; + if (!(gStatuses3[gActiveBank] & STATUS3_YAWN) && !(gBattleMons[gActiveBank].status1 & STATUS_ANY) + && gBattleMons[gActiveBank].ability != ABILITY_VITAL_SPIRIT + && gBattleMons[gActiveBank].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBank)) + { + CancelMultiTurnMoves(gActiveBank); + gBattleMons[gActiveBank].status1 |= (Random() & 3) + 2; + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + gEffectBank = gActiveBank; + BattleScriptExecute(BattleScript_YawnMakesAsleep); + effect++; + } + } + BATTLE_STRUCT->turnEffectsTracker++; + break; + case 19: // done + BATTLE_STRUCT->turnEffectsTracker = 0; + BATTLE_STRUCT->turnEffectsBank++; + break; + } + if (effect != 0) + return effect; + } + } + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); + return 0; +} + +bool8 HandleWishPerishSongOnTurnEnd(void) +{ + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); + switch (BATTLE_STRUCT->sub80170DC_Tracker) + { + case 0: // future sight + while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks) + { + gActiveBank = BATTLE_STRUCT->sub80170DC_Bank; + if (gAbsentBankFlags & gBitTable[gActiveBank]) + BATTLE_STRUCT->sub80170DC_Bank++; + else + { + BATTLE_STRUCT->sub80170DC_Bank++; + if (gWishFutureKnock.futureSightCounter[gActiveBank] && --gWishFutureKnock.futureSightCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp) + { + if (gWishFutureKnock.futureSightMove[gActiveBank] == MOVE_FUTURE_SIGHT) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else //Doom Desire + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = gWishFutureKnock.futureSightMove[gActiveBank]; + gBattleTextBuff1[3] = gWishFutureKnock.futureSightMove[gActiveBank] >> 8; + gBattleTextBuff1[4] = 0xFF; + gBankTarget = gActiveBank; + gBankAttacker = gWishFutureKnock.futureSightAttacker[gActiveBank]; + gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBank]; + gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; + BattleScriptExecute(BattleScript_MonTookFutureAttack); + return 1; + } + } + } + BATTLE_STRUCT->sub80170DC_Tracker = 1; + BATTLE_STRUCT->sub80170DC_Bank = 0; + case 1: // perish song + while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks) + { + gActiveBank = gBankAttacker = gBanksByTurnOrder[BATTLE_STRUCT->sub80170DC_Bank]; + if (gAbsentBankFlags & gBitTable[gActiveBank]) + BATTLE_STRUCT->sub80170DC_Bank++; + else + { + BATTLE_STRUCT->sub80170DC_Bank++; + if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 1; + gBattleTextBuff1[2] = 1; + gBattleTextBuff1[3] = 1; + gBattleTextBuff1[4] = gDisableStructs[gActiveBank].perishSong1; + gBattleTextBuff1[5] = 0xFF; + if (gDisableStructs[gActiveBank].perishSong1 == 0) + { + gStatuses3[gActiveBank] &= ~(STATUS3_PERISH_SONG); + gBattleMoveDamage = gBattleMons[gActiveBank].hp; + gBattlescriptCurrInstr = BattleScript_PerishSongHits; + } + else + { + gDisableStructs[gActiveBank].perishSong1--; + gBattlescriptCurrInstr = BattleScript_PerishSongTimerGoesDown; + } + BattleScriptExecute(gBattlescriptCurrInstr); + return 1; + } + } + } + break; + } + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); + return 0; +} + +#define HandleFaintedMonActions_MAX_CASE 7 + +bool8 HandleFaintedMonActions(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + return 0; + do + { + int i; + switch (BATTLE_STRUCT->sub80173A4_Tracker) + { + case 0: + BATTLE_STRUCT->unk1605A = 0; + BATTLE_STRUCT->sub80173A4_Tracker++; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gAbsentBankFlags & gBitTable[i] && !sub_8018018(i, 6, 6)) + gAbsentBankFlags &= ~(gBitTable[i]); + } + case 1: + do + { + gBank1 = gBankTarget = BATTLE_STRUCT->unk1605A; + if (gBattleMons[BATTLE_STRUCT->unk1605A].hp == 0 && !(BATTLE_STRUCT->unk16113 & gBitTable[gBattlePartyID[BATTLE_STRUCT->unk1605A]]) && !(gAbsentBankFlags & gBitTable[BATTLE_STRUCT->unk1605A])) + { + BattleScriptExecute(BattleScript_GiveExp); + BATTLE_STRUCT->sub80173A4_Tracker = 2; + return 1; + } + } while (++BATTLE_STRUCT->unk1605A != gNoOfAllBanks); + BATTLE_STRUCT->sub80173A4_Tracker = 3; + break; + case 2: + sub_8015740(gBank1); + if (++BATTLE_STRUCT->unk1605A == gNoOfAllBanks) + BATTLE_STRUCT->sub80173A4_Tracker = 3; + else + BATTLE_STRUCT->sub80173A4_Tracker = 1; + break; + case 3: + BATTLE_STRUCT->unk1605A = 0; + BATTLE_STRUCT->sub80173A4_Tracker++; + case 4: + do + { + gBank1 = gBankTarget = BATTLE_STRUCT->unk1605A; //or should banks be switched? + if (gBattleMons[BATTLE_STRUCT->unk1605A].hp == 0 && !(gAbsentBankFlags & gBitTable[BATTLE_STRUCT->unk1605A])) + { + BattleScriptExecute(BattleScript_HandleFaintedMon); + BATTLE_STRUCT->sub80173A4_Tracker = 5; + return 1; + } + } while (++BATTLE_STRUCT->unk1605A != gNoOfAllBanks); + BATTLE_STRUCT->sub80173A4_Tracker = 6; + break; + case 5: + if (++BATTLE_STRUCT->unk1605A == gNoOfAllBanks) + BATTLE_STRUCT->sub80173A4_Tracker = 6; + else + BATTLE_STRUCT->sub80173A4_Tracker = 4; + break; + case 6: + if (AbilityBattleEffects(9, 0, 0, 0, 0) || AbilityBattleEffects(0xB, 0, 0, 0, 0) || ItemBattleEffects(1, 0, 1) || AbilityBattleEffects(6, 0, 0, 0, 0)) + return 1; + BATTLE_STRUCT->sub80173A4_Tracker++; + break; + case 7: + break; + } + } while (BATTLE_STRUCT->sub80173A4_Tracker != HandleFaintedMonActions_MAX_CASE); + return 0; +} + +void TryClearRageStatuses(void) +{ + int i; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].status2 & STATUS2_RAGE && gChosenMovesByBanks[i] != MOVE_RAGE) + gBattleMons[i].status2 &= ~(STATUS2_RAGE); + } +} + +#define ATKCANCELLER_MAX_CASE 14 + +u8 AtkCanceller_UnableToUseMove(void) +{ + u8 effect = 0; + s32* bideDmg = &BATTLE_STRUCT->bideDmg; + do + { + switch (BATTLE_STRUCT->atkCancellerTracker) + { + case 0: // flags clear + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_DESTINY_BOND); + gStatuses3[gBankAttacker] &= ~(STATUS3_GRUDGE); + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 1: // check being asleep + if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) + { + if (UproarWakeUpCheck(gBankAttacker)) + { + gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); + BattleScriptPushCursor(); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + effect = 2; + } + else + { + u8 toSub; + if (gBattleMons[gBankAttacker].ability == ABILITY_EARLY_BIRD) + toSub = 2; + else + toSub = 1; + if ((gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) < toSub) + gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP); + else + gBattleMons[gBankAttacker].status1 -= toSub; + if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) + { + if (gCurrentMove != MOVE_SNORE && gCurrentMove != MOVE_SLEEP_TALK) + { + gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 2; + } + } + else + { + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE); + BattleScriptPushCursor(); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + effect = 2; + } + } + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 2: // check being frozen + if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE) + { + if (Random() % 5) + { + if (gBattleMoves[gCurrentMove].effect != EFFECT_THAW_HIT) // unfreezing via a move effect happens in case 13 + { + gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; + gHitMarker |= HITMARKER_NO_ATTACKSTRING; + } + else + { + BATTLE_STRUCT->atkCancellerTracker++; + break; + } + } + else // unfreeze + { + gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + effect = 2; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 3: // truant + if (gBattleMons[gBankAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBankAttacker].truantCounter) + { + CancelMultiTurnMoves(gBankAttacker); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; + gBattleMoveFlags |= MOVESTATUS_MISSED; + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 4: // recharge + if (gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE) + { + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RECHARGE); + gDisableStructs[gBankAttacker].rechargeCounter = 0; + CancelMultiTurnMoves(gBankAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 5: // flinch + if (gBattleMons[gBankAttacker].status2 & STATUS2_FLINCHED) + { + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_FLINCHED); + gProtectStructs[gBankAttacker].flinchImmobility = 1; + CancelMultiTurnMoves(gBankAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 6: // disabled move + if (gDisableStructs[gBankAttacker].disabledMove == gCurrentMove && gDisableStructs[gBankAttacker].disabledMove != 0) + { + gProtectStructs[gBankAttacker].usedDisabledMove = 1; + BATTLE_STRUCT->scriptingActive = gBankAttacker; + CancelMultiTurnMoves(gBankAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 7: // taunt + if (gDisableStructs[gBankAttacker].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0) + { + gProtectStructs[gBankAttacker].usedTauntedMove = 1; + CancelMultiTurnMoves(gBankAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 8: // imprisoned + if (IsImprisoned(gBankAttacker, gCurrentMove)) + { + gProtectStructs[gBankAttacker].usedImprisionedMove = 1; + CancelMultiTurnMoves(gBankAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 9: // confusion + if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION) + { + gBattleMons[gBankAttacker].status2--; + if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION) + { + if (Random() & 1) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + BattleScriptPushCursor(); + } + else // confusion dmg + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBankTarget = gBankAttacker; + gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker); + gProtectStructs[gBankAttacker].confusionSelfDmg = 1; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + } + gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; + } + else // snapped out of confusion + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; + } + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 10: // paralysis + if (gBattleMons[gBankAttacker].status1 & STATUS_PARALYSIS && (Random() % 4) == 0) + { + gProtectStructs[gBankAttacker].prlzImmobility = 1; + CancelMultiTurnMoves(gBankAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 11: // infatuation + if (gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) + { + BATTLE_STRUCT->scriptingActive = CountTrailingZeroBits((gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) >> 0x10); + if (Random() & 1) + BattleScriptPushCursor(); + else + { + BattleScriptPush(BattleScript_MoveUsedIsParalyzedCantAttack); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gProtectStructs[gBankAttacker].loveImmobility = 1; + CancelMultiTurnMoves(gBankAttacker); + } + gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 12: // bide + if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE) + { + gBattleMons[gBankAttacker].status2 -= 0x100; + if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE) + gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; + else + { + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); + if (gTakenDmg[gBankAttacker]) + { + gCurrentMove = MOVE_BIDE; + *bideDmg = gTakenDmg[gBankAttacker] * 2; + gBankTarget = gTakenDmgBanks[gBankAttacker]; + if (gAbsentBankFlags & gBitTable[gBankTarget]) + gBankTarget = GetMoveTarget(MOVE_BIDE, 1); + gBattlescriptCurrInstr = BattleScript_BideAttack; + } + else + gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; + } + effect = 1; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 13: // move thawing + if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE) + { + if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) + { + gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + effect = 2; + } + BATTLE_STRUCT->atkCancellerTracker++; + break; + case 14: // last case + break; + } + + } while (BATTLE_STRUCT->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0); + + if (effect == 2) + { + gActiveBank = gBankAttacker; + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + } + return effect; +} + +bool8 sub_8018018(u8 bank, u8 r1, u8 r2) +{ + struct Pokemon* party; + u8 r7; + u8 r6; + s32 i; + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + return 0; + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + r7 = sub_803FC34(bank); + if (GetBankSide(bank) == 0) + party = gPlayerParty; + else + party = gEnemyParty; + r6 = sub_803FBFC(r7); + for (i = r6 * 3; i < r6 * 3 + 3; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) + break; + } + return (i == r6 * 3 + 3); + } + else + { + if (GetBankSide(bank) == 1) + { + r7 = GetBankByIdentity(1); + r6 = GetBankByIdentity(3); + party = gEnemyParty; + } + else + { + r7 = GetBankByIdentity(0); + r6 = GetBankByIdentity(2); + party = gPlayerParty; + } + if (r1 == 6) + r1 = gBattlePartyID[r7]; + if (r2 == 6) + r2 = gBattlePartyID[r6]; + for (i = 0; i < 6; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG && i != r1 && i != r2 && i != ewram16068arr(r7) && i != ewram16068arr(r6)) + break; + } + return (i == 6); + } +} + +enum +{ + CASTFORM_NO_CHANGE, //0 + CASTFORM_TO_NORMAL, //1 + CASTFORM_TO_FIRE, //2 + CASTFORM_TO_WATER, //3 + CASTFORM_TO_ICE, //4 +}; + +u8 CastformDataTypeChange(u8 bank) +{ + u8 formChange = 0; + if (gBattleMons[bank].species != SPECIES_CASTFORM || gBattleMons[bank].ability != ABILITY_FORECAST || gBattleMons[bank].hp == 0) + return CASTFORM_NO_CHANGE; + if (!WEATHER_HAS_EFFECT && gBattleMons[bank].type1 != TYPE_NORMAL && gBattleMons[bank].type2 != TYPE_NORMAL) + { + gBattleMons[bank].type1 = TYPE_NORMAL; + gBattleMons[bank].type2 = TYPE_NORMAL; + return CASTFORM_TO_NORMAL; + } + if (!WEATHER_HAS_EFFECT) + return CASTFORM_NO_CHANGE; + if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL)) && gBattleMons[bank].type1 != TYPE_NORMAL && gBattleMons[bank].type2 != TYPE_NORMAL) + { + gBattleMons[bank].type1 = TYPE_NORMAL; + gBattleMons[bank].type2 = TYPE_NORMAL; + formChange = CASTFORM_TO_NORMAL; + } + if (gBattleWeather & WEATHER_SUN_ANY && gBattleMons[bank].type1 != TYPE_FIRE && gBattleMons[bank].type2 != TYPE_FIRE) + { + gBattleMons[bank].type1 = TYPE_FIRE; + gBattleMons[bank].type2 = TYPE_FIRE; + formChange = CASTFORM_TO_FIRE; + } + if (gBattleWeather & WEATHER_RAIN_ANY && gBattleMons[bank].type1 != TYPE_WATER && gBattleMons[bank].type2 != TYPE_WATER) + { + gBattleMons[bank].type1 = TYPE_WATER; + gBattleMons[bank].type2 = TYPE_WATER; + formChange = CASTFORM_TO_WATER; + } + if (gBattleWeather & WEATHER_HAIL && gBattleMons[bank].type1 != TYPE_ICE && gBattleMons[bank].type2 != TYPE_ICE) + { + gBattleMons[bank].type1 = TYPE_ICE; + gBattleMons[bank].type2 = TYPE_ICE; + formChange = CASTFORM_TO_ICE; + } + return formChange; +} + +u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) +{ + u8 effect = 0; + struct Pokemon* pokeAtk; + struct Pokemon* pokeDef; + u16 speciesAtk; + u16 speciesDef; + u32 pidAtk; + u32 pidDef; + + if (gBankAttacker >= gNoOfAllBanks) + gBankAttacker = bank; + if (GetBankSide(gBankAttacker) == 0) + pokeAtk = &gPlayerParty[gBattlePartyID[gBankAttacker]]; + else + pokeAtk = &gEnemyParty[gBattlePartyID[gBankAttacker]]; + + if (gBankTarget >= gNoOfAllBanks) + gBankTarget = bank; + if (GetBankSide(gBankTarget) == 0) + pokeDef = &gPlayerParty[gBattlePartyID[gBankTarget]]; + else + pokeDef = &gEnemyParty[gBattlePartyID[gBankTarget]]; + + speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES); + pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY); + + speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES); + pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY); + + if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // why isn't that check done at the beginning? + { + u8 moveType; + s32 i; + u16 move; + u8 side; + u8 target1; + + if (special) + gLastUsedAbility = special; + else + gLastUsedAbility = gBattleMons[bank].ability; + + if (moveArg) + move = moveArg; + else + move = gCurrentMove; + + if (BATTLE_STRUCT->dynamicMoveType) + moveType = BATTLE_STRUCT->dynamicMoveType & 0x3F; + else + moveType = gBattleMoves[move].type; + + //_080184AC + switch (caseID) + { + case ABILITYEFFECT_ON_SWITCHIN: // 0 + //_08018518 + if (gBankAttacker >= gNoOfAllBanks) + gBankAttacker = bank; + switch (gLastUsedAbility) + { + case 0xFF: //weather from overworld + //_08018586 + switch (weather_get_current()) + { + case WEATHER_RAIN_LIGHT: + case WEATHER_RAIN_MED: + case WEATHER_RAIN_HEAVY: + if (!(gBattleWeather & WEATHER_RAIN_ANY)) + { + gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); + BATTLE_STRUCT->animArg1 = B_ANIM_RAIN_CONTINUES; + BATTLE_STRUCT->scriptingActive = bank; + effect++; + } + break; + case WEATHER_SANDSTORM: + if (!(gBattleWeather & WEATHER_SANDSTORM_ANY)) + { + gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); + BATTLE_STRUCT->animArg1 = B_ANIM_SANDSTORM_CONTINUES; + BATTLE_STRUCT->scriptingActive = bank; + effect++; + } + break; + case WEATHER_DROUGHT: + if (!(gBattleWeather & WEATHER_SUN_ANY)) + { + gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); + BATTLE_STRUCT->animArg1 = B_ANIM_SUN_CONTINUES; + BATTLE_STRUCT->scriptingActive = bank; + effect++; + } + break; + } + if (effect) + { + gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current(); + BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); + } + break; + case ABILITY_DRIZZLE: + //_08018680 + if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) + { + gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); + BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); + BATTLE_STRUCT->scriptingActive = bank; + effect++; + } + break; + case ABILITY_SAND_STREAM: + //_080186B8 + if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT)) + { + gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); + BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); + BATTLE_STRUCT->scriptingActive = bank; + effect++; + } + break; + case ABILITY_DROUGHT: + //_080186F0 + if (!(gBattleWeather & WEATHER_SUN_PERMANENT)) + { + gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); + BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); + BATTLE_STRUCT->scriptingActive = bank; + effect++; + } + break; + case ABILITY_INTIMIDATE: + //_08018728 + if (!(gSpecialStatuses[bank].intimidatedPoke)) + { + gStatuses3[bank] |= STATUS3_INTIMIDATE_POKES; + gSpecialStatuses[bank].intimidatedPoke = 1; + } + break; + case ABILITY_FORECAST: + //_0801875C + effect = CastformDataTypeChange(bank); + if (effect != 0) + { + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + BATTLE_STRUCT->scriptingActive = bank; + BATTLE_STRUCT->castformToChangeInto = effect - 1; + } + break; + case ABILITY_TRACE: + //_080187A0 + if (!(gSpecialStatuses[bank].traced)) + { + gStatuses3[bank] |= STATUS3_TRACE; + gSpecialStatuses[bank].traced = 1; + } + break; + case ABILITY_CLOUD_NINE: + case ABILITY_AIR_LOCK: + //_080187DC + { + // that's a weird choice for a variable, why not use i or bank? + for (target1 = 0; target1 < gNoOfAllBanks; target1++) + { + effect = CastformDataTypeChange(target1); + if (effect != 0) + { + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + BATTLE_STRUCT->scriptingActive = target1; + BATTLE_STRUCT->castformToChangeInto = effect - 1; + break; + } + } + } + break; + } + break; + case ABILITYEFFECT_ENDTURN: // 1 + //_08018814 + if (gBattleMons[bank].hp != 0) + { + gBankAttacker = bank; + switch (gLastUsedAbility) + { + case ABILITY_RAIN_DISH: + if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) + && gBattleMons[bank].maxHP > gBattleMons[bank].hp) + { + gLastUsedAbility = ABILITY_RAIN_DISH; // why + BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); + gBattleMoveDamage = gBattleMons[bank].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + effect++; + } + break; + case ABILITY_SHED_SKIN: + if ((gBattleMons[bank].status1 & STATUS_ANY) && (Random() % 3) == 0) + { + if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON)) + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + if (gBattleMons[bank].status1 & STATUS_SLEEP) + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + if (gBattleMons[bank].status1 & STATUS_PARALYSIS) + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + if (gBattleMons[bank].status1 & STATUS_BURN) + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + if (gBattleMons[bank].status1 & STATUS_FREEZE) + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + gBattleMons[bank].status1 = 0; + // BUG: The nightmare status does not get cleared here. This was fixed in Emerald. + //gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); + BATTLE_STRUCT->scriptingActive = gActiveBank = bank; + BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); + MarkBufferBankForExecution(gActiveBank); + effect++; + } + break; + case ABILITY_SPEED_BOOST: + if (gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC && gDisableStructs[bank].isFirstTurn != 2) + { + gBattleMons[bank].statStages[STAT_STAGE_SPEED]++; + BATTLE_STRUCT->animArg1 = 0x11; + BATTLE_STRUCT->animArg2 = 0; + BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); + BATTLE_STRUCT->scriptingActive = bank; + effect++; + } + break; + case ABILITY_TRUANT: + gDisableStructs[gBankAttacker].truantCounter ^= 1; + break; + } + } + break; + case ABILITYEFFECT_MOVES_BLOCK: // 2 + //_08018A40 + if (gLastUsedAbility == ABILITY_SOUNDPROOF) + { + for (i = 0; gSoundMovesTable[i] != 0xFFFF; i++) + { + if (gSoundMovesTable[i] == move) + break; + } + if (gSoundMovesTable[i] != 0xFFFF) + { + if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + gBattlescriptCurrInstr = BattleScript_SoundproofProtected; + effect = 1; + } + } + break; + case ABILITYEFFECT_ABSORBING: // 3 + //_08018AD8 + if (move) + { + switch (gLastUsedAbility) + { + case ABILITY_VOLT_ABSORB: + if (moveType == TYPE_ELECTRIC && gBattleMoves[move].power != 0) + { + if (gProtectStructs[gBankAttacker].notFirstStrike) + gBattlescriptCurrInstr = BattleScript_MoveHPDrain; + else + gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; + effect = 1; + } + break; + case ABILITY_WATER_ABSORB: + if (moveType == TYPE_WATER && gBattleMoves[move].power != 0) + { + if (gProtectStructs[gBankAttacker].notFirstStrike) + gBattlescriptCurrInstr = BattleScript_MoveHPDrain; + else + gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; + effect = 1; + } + break; + case ABILITY_FLASH_FIRE: + if (moveType == TYPE_FIRE && !(gBattleMons[bank].status1 & STATUS_FREEZE)) + { + if (!(eFlashFireArr.arr[bank] & 1)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + if (gProtectStructs[gBankAttacker].notFirstStrike) + gBattlescriptCurrInstr = BattleScript_FlashFireBoost; + else + gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; + eFlashFireArr.arr[bank] |= 1; + effect = 2; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + if (gProtectStructs[gBankAttacker].notFirstStrike) + gBattlescriptCurrInstr = BattleScript_FlashFireBoost; + else + gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; + effect = 2; + } + } + break; + } + if (effect == 1) + { + if (gBattleMons[bank].maxHP == gBattleMons[bank].hp) + { + if ((gProtectStructs[gBankAttacker].notFirstStrike)) + gBattlescriptCurrInstr = BattleScript_MoveHPDrain_FullHP; + else + gBattlescriptCurrInstr = BattleScript_MoveHPDrain_FullHP_PPLoss; + } + else + { + gBattleMoveDamage = gBattleMons[bank].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + } + } + } + break; + case ABILITYEFFECT_CONTACT: // 4 + //_08018CF0 + switch (gLastUsedAbility) + { + case ABILITY_COLOR_CHANGE: + //_08018DCC + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && move != MOVE_STRUGGLE + && gBattleMoves[move].power != 0 + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && gBattleMons[bank].type1 != moveType + && gBattleMons[bank].type2 != moveType + && gBattleMons[bank].hp != 0) + { + gBattleMons[bank].type1 = moveType; + gBattleMons[bank].type2 = moveType; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 3; + gBattleTextBuff1[2] = moveType; + gBattleTextBuff1[3] = 0xFF; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; + effect++; + } + break; + case ABILITY_ROUGH_SKIN: + //_08018E94 + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; + effect++; + } + break; + case ABILITY_EFFECT_SPORE: + //_08018F54 + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 10) == 0) + { + do + { + gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; + } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); + if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) + gBattleCommunication[MOVE_EFFECT_BYTE] += 2; + gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITY_POISON_POINT: + //_0801904C + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITY_STATIC: + //_08019128 + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITY_FLAME_BODY: + //_08019204 + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITY_CUTE_CHARM: + //_080192E0 + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && gBattleMons[gBankTarget].hp != 0 + && (Random() % 3) == 0 + && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) + && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF + && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) + { + gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; + effect++; + } + break; + } + break; + case ABILITYEFFECT_IMMUNITY: // 5 + //_08019448 + { + for (bank = 0; bank < gNoOfAllBanks; bank++) + { + switch (gBattleMons[bank].ability) + { + case ABILITY_IMMUNITY: + if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00)) // TODO: what is 0xF00? + { + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + effect = 1; + } + break; + case ABILITY_OWN_TEMPO: + if (gBattleMons[bank].status2 & STATUS2_CONFUSION) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); + effect = 2; + } + break; + case ABILITY_LIMBER: + if (gBattleMons[bank].status1 & STATUS_PARALYSIS) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + effect = 1; + } + break; + case ABILITY_INSOMNIA: + case ABILITY_VITAL_SPIRIT: + if (gBattleMons[bank].status1 & STATUS_SLEEP) + { + gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + effect = 1; + } + break; + case ABILITY_WATER_VEIL: + if (gBattleMons[bank].status1 & STATUS_BURN) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + effect = 1; + } + break; + case ABILITY_MAGMA_ARMOR: + if (gBattleMons[bank].status1 & STATUS_FREEZE) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + effect = 1; + } + break; + case ABILITY_OBLIVIOUS: + if (gBattleMons[bank].status2 & STATUS2_INFATUATION) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); + effect = 3; + } + break; + } + if (effect) + { + switch (effect) + { + case 1: // status cleared + gBattleMons[bank].status1 = 0; + break; + case 2: // get rid of confusion + gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); + break; + case 3: // get rid of infatuation + gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); + break; + } + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; + BATTLE_STRUCT->scriptingActive = bank; + gActiveBank = bank; + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + return effect; + } + } + } + break; + case ABILITYEFFECT_FORECAST: // 6 + //_080197B4 + { + for (bank = 0; bank < gNoOfAllBanks; bank++) + { + if (gBattleMons[bank].ability == ABILITY_FORECAST) + { + effect = CastformDataTypeChange(bank); + if (effect) + { + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + BATTLE_STRUCT->scriptingActive = bank; + BATTLE_STRUCT->castformToChangeInto = effect - 1; + return effect; + } + } + } + } + break; + case ABILITYEFFECT_SYNCHRONIZE: // 7 + //_08019804 + if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) + { + gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); + BATTLE_STRUCT->synchroniseEffect &= 0x3F; + if (BATTLE_STRUCT->synchroniseEffect == 6) + BATTLE_STRUCT->synchroniseEffect = 2; + gBattleCommunication[MOVE_EFFECT_BYTE] = BATTLE_STRUCT->synchroniseEffect + 0x40; + BATTLE_STRUCT->scriptingActive = gBankTarget; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 + //_08019880 + if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) + { + gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); + BATTLE_STRUCT->synchroniseEffect &= 0x3F; + if (BATTLE_STRUCT->synchroniseEffect == 6) + BATTLE_STRUCT->synchroniseEffect = 2; + gBattleCommunication[MOVE_EFFECT_BYTE] = BATTLE_STRUCT->synchroniseEffect; + BATTLE_STRUCT->scriptingActive = gBankAttacker; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITYEFFECT_INTIMIDATE1: // 9 + //_080198FC + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) + { + gLastUsedAbility = ABILITY_INTIMIDATE; + gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); + BattleScriptPushCursorAndCallback(gUnknown_081D978C); + BATTLE_STRUCT->intimidateBank = i; + effect++; + break; + } + } + break; + case ABILITYEFFECT_TRACE: // 11 + //_08019940 + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) + { + u8 target2; + side = (GetBankIdentity(i) ^ 1) & 1; + target1 = GetBankByIdentity(side); + target2 = GetBankByIdentity(side + 2); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 + && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) + { + //_080199AE + gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | side); + gBattleMons[i].ability = gBattleMons[gActiveBank].ability; + gLastUsedAbility = gBattleMons[gActiveBank].ability; + effect++; + } + else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) + { + //_08019A34 + gActiveBank = target1; + gBattleMons[i].ability = gBattleMons[gActiveBank].ability; + gLastUsedAbility = gBattleMons[gActiveBank].ability; + effect++; + } + else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) + { + //_08019A78 + gActiveBank = target2; + gBattleMons[i].ability = gBattleMons[gActiveBank].ability; + gLastUsedAbility = gBattleMons[gActiveBank].ability; + effect++; + } + } + else + //_08019ABC + { + gActiveBank = target1; + if (gBattleMons[target1].ability && gBattleMons[target1].hp) + { + gBattleMons[i].ability = gBattleMons[target1].ability; + gLastUsedAbility = gBattleMons[target1].ability; + effect++; + } + } + if (effect) + { + BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); + gStatuses3[i] &= ~(STATUS3_TRACE); + BATTLE_STRUCT->scriptingActive = i; + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 4; + gBattleTextBuff1[2] = gActiveBank; + gBattleTextBuff1[3] = gBattlePartyID[gActiveBank]; + gBattleTextBuff1[4] = EOS; + + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 9; + gBattleTextBuff2[2] = gLastUsedAbility; + gBattleTextBuff2[3] = EOS; + break; + } + } + } + break; + case ABILITYEFFECT_INTIMIDATE2: // 10 + //_08019B1C + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) + { + gLastUsedAbility = ABILITY_INTIMIDATE; + gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = gUnknown_081D9795; + BATTLE_STRUCT->intimidateBank = i; + effect++; + break; + } + } + break; + case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12 + //_08019B60 + side = GetBankSide(bank); + for (i = 0; i < gNoOfAllBanks; i++) + { + if (GetBankSide(i) != side && gBattleMons[i].ability == ability) + { + gLastUsedAbility = ability; + effect = i + 1; + } + } + break; + case ABILITYEFFECT_CHECK_BANK_SIDE: // 13 + //_08019BBC + side = GetBankSide(bank); + for (i = 0; i < gNoOfAllBanks; i++) + { + if (GetBankSide(i) == side && gBattleMons[i].ability == ability) + { + gLastUsedAbility = ability; + effect = i + 1; + } + } + break; + case ABILITYEFFECT_FIELD_SPORT: // 14 + //_08019C18 + switch (gLastUsedAbility) + { + case 0xFD: + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gStatuses3[i] & STATUS3_MUDSPORT) + effect = i + 1; + } + break; + case 0xFE: + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gStatuses3[i] & STATUS3_WATERSPORT) + effect = i + 1; + } + break; + default: + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ability) + { + gLastUsedAbility = ability; + effect = i + 1; + } + } + break; + } + break; + case ABILITYEFFECT_CHECK_ON_FIELD: // 19 + //_08019CD4 + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0) + { + gLastUsedAbility = ability; + effect = i + 1; + } + } + break; + case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK: // 15 + //_08019D18 + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ability && i != bank) + { + gLastUsedAbility = ability; + effect = i + 1; + } + } + break; + case ABILITYEFFECT_COUNT_OTHER_SIZE: // 16 + //_08019D5C + side = GetBankSide(bank); + for (i = 0; i < gNoOfAllBanks; i++) + { + if (GetBankSide(i) != side && gBattleMons[i].ability == ability) + { + gLastUsedAbility = ability; + effect++; + } + } + break; + case ABILITYEFFECT_COUNT_BANK_SIDE: // 17 + //_08019DB8 + side = GetBankSide(bank); + for (i = 0; i < gNoOfAllBanks; i++) + { + if (GetBankSide(i) == side && gBattleMons[i].ability == ability) + { + gLastUsedAbility = ability; + effect++; + } + } + break; + case ABILITYEFFECT_COUNT_ON_FIELD: // 18 + //_08019F44 + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].ability == ability && i != bank) + { + gLastUsedAbility = ability; + effect++; + } + } + break; + } + //_08019F76 + if (effect && caseID < 0xC && gLastUsedAbility != 0xFF) + RecordAbilityBattle(bank, gLastUsedAbility); + } + + return effect; +} + +void BattleScriptExecute(u8* BS_ptr) +{ + gBattlescriptCurrInstr = BS_ptr; + B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; + gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack; + gCurrentActionFuncId = 0; +} + +void BattleScriptPushCursorAndCallback(u8* BS_ptr) +{ + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BS_ptr; + B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc; + gBattleMainFunc = RunBattleScriptCommands; +} + +enum +{ + ITEM_NO_EFFECT, // 0 + ITEM_STATUS_CHANGE, // 1 + ITEM_EFFECT_OTHER, // 2 + ITEM_PP_CHANGE, // 3 + ITEM_HP_CHANGE, // 4 + ITEM_STATS_CHANGE, // 5 +}; + +enum +{ + FLAVOR_SPICY, // 0 + FLAVOR_DRY, // 1 + FLAVOR_SWEET, // 2 + FLAVOR_BITTER, // 3 + FLAVOR_SOUR, // 4 +}; + +u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn) +{ + int i = 0; + u8 effect = ITEM_NO_EFFECT; + u8 changedPP = 0; + u8 bankHoldEffect, atkHoldEffect, defHoldEffect; + u8 bankQuality, atkQuality, defQuality; + u16 atkItem, defItem; + + gLastUsedItem = gBattleMons[bank].item; + if (gLastUsedItem == ITEM_ENIGMA_BERRY) + { + bankHoldEffect = gEnigmaBerries[bank].holdEffect; + bankQuality = gEnigmaBerries[bank].holdEffectParam; + } + else + { + bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); + bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem); + } + + atkItem = gBattleMons[gBankAttacker].item; + if (atkItem == ITEM_ENIGMA_BERRY) + { + atkHoldEffect = gEnigmaBerries[gBankAttacker].holdEffect; + atkQuality = gEnigmaBerries[gBankAttacker].holdEffectParam; + } + else + { + atkHoldEffect = ItemId_GetHoldEffect(atkItem); + atkQuality = ItemId_GetHoldEffectParam(atkItem); + } + + // def variables are unused + defItem = gBattleMons[gBankTarget].item; + if (defItem == ITEM_ENIGMA_BERRY) + { + defHoldEffect = gEnigmaBerries[gBankTarget].holdEffect; + defQuality = gEnigmaBerries[gBankTarget].holdEffectParam; + } + else + { + defHoldEffect = ItemId_GetHoldEffect(defItem); + defQuality = ItemId_GetHoldEffectParam(defItem); + } + + switch (caseID) + { + case 0: + switch (bankHoldEffect) + { + case HOLD_EFFECT_DOUBLE_PRIZE: + BATTLE_STRUCT->moneyMultiplier = 2; + break; + case HOLD_EFFECT_RESTORE_STATS: + for (i = 0; i < 8; i++) + { + if (gBattleMons[bank].statStages[i] < 6) + { + gBattleMons[bank].statStages[i] = 6; + effect = ITEM_STATS_CHANGE; + } + } + if (effect) + { + BATTLE_STRUCT->scriptingActive = bank; + gStringBank = bank; + gActiveBank = gBankAttacker = bank; + BattleScriptExecute(BattleScript_WhiteHerbEnd2); + } + break; + } + break; + case 1: + if (gBattleMons[bank].hp) + { + switch (bankHoldEffect) + { + case HOLD_EFFECT_RESTORE_HP: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) + { + gBattleMoveDamage = bankQuality; + if (gBattleMons[bank].hp + bankQuality > gBattleMons[bank].maxHP) + gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; + gBattleMoveDamage *= -1; + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); + effect = 4; + } + break; + case HOLD_EFFECT_RESTORE_PP: + if (!moveTurn) + { + struct Pokemon* poke; + u8 ppBonuses; + u16 move; + + if (GetBankSide(bank) == 0) + poke = &gPlayerParty[gBattlePartyID[bank]]; + else + poke = &gEnemyParty[gBattlePartyID[bank]]; + for (i = 0; i < 4; i++) + { + move = GetMonData(poke, MON_DATA_MOVE1 + i); + changedPP = GetMonData(poke, MON_DATA_PP1 + i); + ppBonuses = GetMonData(poke, MON_DATA_PP_BONUSES); + if (move && changedPP == 0) + break; + } + if (i != 4) + { + u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); + if (changedPP + bankQuality > maxPP) + changedPP = maxPP; + else + changedPP = changedPP + bankQuality; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = move; + gBattleTextBuff1[3] = move >> 8; + gBattleTextBuff1[4] = 0xFF; + BattleScriptExecute(BattleScript_BerryPPHealEnd2); + EmitSetMonData(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + MarkBufferBankForExecution(gActiveBank); + effect = ITEM_PP_CHANGE; + } + } + break; + case HOLD_EFFECT_RESTORE_STATS: + for (i = 0; i < 8; i++) + { + if (gBattleMons[bank].statStages[i] < 6) + { + gBattleMons[bank].statStages[i] = 6; + effect = ITEM_STATS_CHANGE; + } + } + if (effect) + { + BATTLE_STRUCT->scriptingActive = bank; + gStringBank = bank; + gActiveBank = gBankAttacker = bank; + BattleScriptExecute(BattleScript_WhiteHerbEnd2); + } + break; + case HOLD_EFFECT_LEFTOVERS: + if (gBattleMons[bank].hp < gBattleMons[bank].maxHP && !moveTurn) + { + gBattleMoveDamage = gBattleMons[bank].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) + gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; + gBattleMoveDamage *= -1; + BattleScriptExecute(BattleScript_ItemHealHP_End2); + effect = ITEM_HP_CHANGE; + RecordItemBattle(bank, bankHoldEffect); + } + break; + // nice copy/paste there gamefreak, making a function for confuse berries was too much eh? + case HOLD_EFFECT_CONFUSE_SPICY: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 8; + gBattleTextBuff1[2] = FLAVOR_SPICY; + gBattleTextBuff1[3] = EOS; + gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) + gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; + gBattleMoveDamage *= -1; + if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SPICY) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); + effect = ITEM_HP_CHANGE; + } + break; + case HOLD_EFFECT_CONFUSE_DRY: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 8; + gBattleTextBuff1[2] = FLAVOR_DRY; + gBattleTextBuff1[3] = EOS; + gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) + gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; + gBattleMoveDamage *= -1; + if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_DRY) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); + effect = ITEM_HP_CHANGE; + } + break; + case HOLD_EFFECT_CONFUSE_SWEET: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 8; + gBattleTextBuff1[2] = FLAVOR_SWEET; + gBattleTextBuff1[3] = EOS; + gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) + gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; + gBattleMoveDamage *= -1; + if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SWEET) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); + effect = ITEM_HP_CHANGE; + } + break; + case HOLD_EFFECT_CONFUSE_BITTER: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 8; + gBattleTextBuff1[2] = FLAVOR_BITTER; + gBattleTextBuff1[3] = EOS; + gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) + gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; + gBattleMoveDamage *= -1; + if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_BITTER) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); + effect = ITEM_HP_CHANGE; + } + break; + case HOLD_EFFECT_CONFUSE_SOUR: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 8; + gBattleTextBuff1[2] = FLAVOR_SOUR; + gBattleTextBuff1[3] = EOS; + gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP) + gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp; + gBattleMoveDamage *= -1; + if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SOUR) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); + effect = ITEM_HP_CHANGE; + } + break; + // copy/paste again, smh + case HOLD_EFFECT_ATTACK_UP: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_ATK] < 0xC) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 5; + gBattleTextBuff1[2] = STAT_STAGE_ATK; + gBattleTextBuff1[3] = EOS; + + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 0; + gBattleTextBuff2[2] = 0xD2; + gBattleTextBuff2[3] = 0xD2 >> 8; + gBattleTextBuff2[4] = EOS; + + gEffectBank = bank; + BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_ATK; + BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_ATK; + BATTLE_STRUCT->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + effect = ITEM_STATS_CHANGE; + } + break; + case HOLD_EFFECT_DEFENSE_UP: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_DEF] < 0xC) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 5; + gBattleTextBuff1[2] = STAT_STAGE_DEF; + gBattleTextBuff1[3] = EOS; + + gEffectBank = bank; + BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_DEF; + BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_DEF; + BATTLE_STRUCT->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + effect = ITEM_STATS_CHANGE; + } + break; + case HOLD_EFFECT_SPEED_UP: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 5; + gBattleTextBuff1[2] = STAT_STAGE_SPEED; + gBattleTextBuff1[3] = EOS; + + gEffectBank = bank; + BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPEED; + BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPEED; + BATTLE_STRUCT->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + effect = ITEM_STATS_CHANGE; + } + break; + case HOLD_EFFECT_SP_ATTACK_UP: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPATK] < 0xC) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 5; + gBattleTextBuff1[2] = STAT_STAGE_SPATK; + gBattleTextBuff1[3] = EOS; + + gEffectBank = bank; + BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPATK; + BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPATK; + BATTLE_STRUCT->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + effect = ITEM_STATS_CHANGE; + } + break; + case HOLD_EFFECT_SP_DEFENSE_UP: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPDEF] < 0xC) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 5; + gBattleTextBuff1[2] = STAT_STAGE_SPDEF; + gBattleTextBuff1[3] = EOS; + + gEffectBank = bank; + BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPDEF; + BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPDEF; + BATTLE_STRUCT->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + effect = ITEM_STATS_CHANGE; + } + break; + case HOLD_EFFECT_CRITICAL_UP: + if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && !(gBattleMons[bank].status2 & STATUS2_FOCUS_ENERGY)) + { + gBattleMons[bank].status2 |= STATUS2_FOCUS_ENERGY; + BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); + effect = ITEM_EFFECT_OTHER; + } + break; + case HOLD_EFFECT_RANDOM_STAT_UP: + if (!moveTurn && gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality) + { + for (i = 0; i < 5; i++) + { + if (gBattleMons[bank].statStages[STAT_STAGE_ATK + i] < 0xC) + break; + } + if (i != 5) + { + do + { + i = Random() % 5; + } while (gBattleMons[bank].statStages[STAT_STAGE_ATK + i] == 0xC); + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 5; + gBattleTextBuff1[2] = i + 1; + gBattleTextBuff1[3] = EOS; + + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 0; + gBattleTextBuff2[2] = 0xD1; + gBattleTextBuff2[3] = 0xD1 >> 8; + gBattleTextBuff2[4] = 0; + gBattleTextBuff2[5] = 0xD2; + gBattleTextBuff2[6] = 0xD2 >> 8; + gBattleTextBuff2[7] = EOS; + + gEffectBank = bank; + BATTLE_STRUCT->statChanger = 0x21 + i; + BATTLE_STRUCT->animArg1 = 0x21 + i + 6; + BATTLE_STRUCT->animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + effect = ITEM_STATS_CHANGE; + } + } + break; + case HOLD_EFFECT_CURE_PAR: + if (gBattleMons[bank].status1 & STATUS_PARALYSIS) + { + gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS); + BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_PSN: + if (gBattleMons[bank].status1 & STATUS_PSN_ANY) + { + gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER); + BattleScriptExecute(BattleScript_BerryCurePsnEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_BRN: + if (gBattleMons[bank].status1 & STATUS_BURN) + { + gBattleMons[bank].status1 &= ~(STATUS_BURN); + BattleScriptExecute(BattleScript_BerryCureBrnEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_FRZ: + if (gBattleMons[bank].status1 & STATUS_FREEZE) + { + gBattleMons[bank].status1 &= ~(STATUS_FREEZE); + BattleScriptExecute(BattleScript_BerryCureFrzEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_SLP: + if (gBattleMons[bank].status1 & STATUS_SLEEP) + { + gBattleMons[bank].status1 &= ~(STATUS_SLEEP); + gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); + BattleScriptExecute(BattleScript_BerryCureSlpEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_CONFUSION: + if (gBattleMons[bank].status2 & STATUS2_CONFUSION) + { + gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); + BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); + effect = ITEM_EFFECT_OTHER; + } + break; + case HOLD_EFFECT_CURE_STATUS: + if (gBattleMons[bank].status1 & STATUS_ANY || gBattleMons[bank].status2 & STATUS2_CONFUSION) + { + i = 0; + if (gBattleMons[bank].status1 & STATUS_PSN_ANY) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + i++; + } + if (gBattleMons[bank].status1 & STATUS_SLEEP) + { + gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + i++; + } + if (gBattleMons[bank].status1 & STATUS_PARALYSIS) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + i++; + } + if (gBattleMons[bank].status1 & STATUS_BURN) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + i++; + } + if (gBattleMons[bank].status1 & STATUS_FREEZE) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + i++; + } + if (gBattleMons[bank].status2 & STATUS2_CONFUSION) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); + i++; + } + if (!(i > 1)) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleMons[bank].status1 = 0; + gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); + BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_ATTRACT: + if (gBattleMons[bank].status2 & STATUS2_INFATUATION) + { + gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); + StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); + BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + effect = ITEM_EFFECT_OTHER; + } + break; + } + if (effect) + { + BATTLE_STRUCT->scriptingActive = bank; + gStringBank = bank; + gActiveBank = gBankAttacker = bank; + switch (effect) + { + case ITEM_STATUS_CHANGE: + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); + MarkBufferBankForExecution(gActiveBank); + break; + case ITEM_PP_CHANGE: + if (!(gBattleMons[bank].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[bank].unk18_b & gBitTable[i])) + gBattleMons[bank].pp[i] = changedPP; + break; + } + } + } + break; + case 2: + break; + case 3: + for (bank = 0; bank < gNoOfAllBanks; bank++) + { + gLastUsedItem = gBattleMons[bank].item; + if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY) + { + bankHoldEffect = gEnigmaBerries[bank].holdEffect; + bankQuality = gEnigmaBerries[bank].holdEffectParam; + } + else + { + bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); + bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem); + } + switch (bankHoldEffect) + { + case HOLD_EFFECT_CURE_PAR: + if (gBattleMons[bank].status1 & STATUS_PARALYSIS) + { + gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryCureParRet; + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_PSN: + if (gBattleMons[bank].status1 & STATUS_PSN_ANY) + { + gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet; + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_BRN: + if (gBattleMons[bank].status1 & STATUS_BURN) + { + gBattleMons[bank].status1 &= ~(STATUS_BURN); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_FRZ: + if (gBattleMons[bank].status1 & STATUS_FREEZE) + { + gBattleMons[bank].status1 &= ~(STATUS_FREEZE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_SLP: + if (gBattleMons[bank].status1 & STATUS_SLEEP) + { + gBattleMons[bank].status1 &= ~(STATUS_SLEEP); + gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_CONFUSION: + if (gBattleMons[bank].status2 & STATUS2_CONFUSION) + { + gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; + effect = ITEM_EFFECT_OTHER; + } + break; + case HOLD_EFFECT_CURE_ATTRACT: + if (gBattleMons[bank].status2 & STATUS2_INFATUATION) + { + gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); + StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); + BattleScriptPushCursor(); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; + effect = ITEM_EFFECT_OTHER; + } + break; + case HOLD_EFFECT_CURE_STATUS: + if (gBattleMons[bank].status1 & STATUS_ANY || gBattleMons[bank].status2 & STATUS2_CONFUSION) + { + if (gBattleMons[bank].status1 & STATUS_PSN_ANY) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + } + if (gBattleMons[bank].status1 & STATUS_SLEEP) + { + gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + } + if (gBattleMons[bank].status1 & STATUS_PARALYSIS) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + } + if (gBattleMons[bank].status1 & STATUS_BURN) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + } + if (gBattleMons[bank].status1 & STATUS_FREEZE) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + } + if (gBattleMons[bank].status2 & STATUS2_CONFUSION) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); + } + gBattleMons[bank].status1 = 0; + gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); + BattleScriptPushCursor(); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_RESTORE_STATS: + for (i = 0; i < 8; i++) + { + if (gBattleMons[bank].statStages[i] < 6) + { + gBattleMons[bank].statStages[i] = 6; + effect = ITEM_STATS_CHANGE; + } + } + if (effect) + { + BATTLE_STRUCT->scriptingActive = bank; + gStringBank = bank; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; + return effect; // unnecessary return + } + break; + } + if (effect) + { + BATTLE_STRUCT->scriptingActive = bank; + gStringBank = bank; + gActiveBank = bank; + EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + break; + } + } + break; + case 4: + if (gBattleMoveDamage) + { + switch (atkHoldEffect) + { + case HOLD_EFFECT_FLINCH: + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (Random() % 100) < bankQuality + && gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED + && gBattleMons[gBankTarget].hp) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 8; + BattleScriptPushCursor(); + SetMoveEffect(0, 0); + BattleScriptPop(); + } + break; + case HOLD_EFFECT_SHELL_BELL: + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gSpecialStatuses[gBankTarget].moveturnLostHP != 0 + && gSpecialStatuses[gBankTarget].moveturnLostHP != 0xFFFF + && gBankAttacker != gBankTarget + && gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP + && gBattleMons[gBankAttacker].hp != 0) + { + gLastUsedItem = atkItem; + gStringBank = gBankAttacker; + BATTLE_STRUCT->scriptingActive = gBankAttacker; + gBattleMoveDamage = (gSpecialStatuses[gBankTarget].moveturnLostHP / atkQuality) * -1; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = -1; + gSpecialStatuses[gBankTarget].moveturnLostHP = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; + effect++; + } + break; + } + } + break; + } + + return effect; +} + +struct CombinedMove +{ + u16 move1; + u16 move2; + u16 newMove; +}; + +static const struct CombinedMove sCombinedMoves[2] = +{ + {MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE}, + {0xFFFF, 0xFFFF, 0xFFFF} +}; + +void unref_sub_801B40C(void) +{ + int i = 0; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + do + { + u8 bank = 0; + do + { + u8 absent = gAbsentBankFlags; + if (gBitTable[bank] & absent || absent & gBitTable[bank + 2]) + bank++; + else + { + if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank + 2]) + { + gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4); + gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; + gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4; + } + if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank + 2] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank]) + { + gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank + 2) | ((bank) << 4); + gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove; + gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4; + } + bank++; + } + } while (bank < 2); + i++; + } while (sCombinedMoves[i].move1 != 0xFFFF); + } +} + +void sub_801B594(void) +{ + if (gBattleExecBuffer == 0) + gBattleScriptingCommandsTable[*gBattlescriptCurrInstr](); +} + +u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target +{ + u8 targetBank = 0; + u8 moveTarget; + u8 side; + + if (useMoveTarget) + moveTarget = useMoveTarget - 1; + else + moveTarget = gBattleMoves[move].target; + + switch (moveTarget) + { + case 0: + side = GetBankSide(gBankAttacker) ^ 1; + if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + targetBank = gSideTimers[side].followmeTarget; + else + { + side = GetBankSide(gBankAttacker); + do + { + targetBank = Random() % gNoOfAllBanks; + } while (targetBank == gBankAttacker || side == GetBankSide(targetBank) || gAbsentBankFlags & gBitTable[targetBank]); + if (gBattleMoves[move].type == TYPE_ELECTRIC + && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_LIGHTNING_ROD, 0, 0) + && gBattleMons[targetBank].ability != ABILITY_LIGHTNING_ROD) + { + targetBank ^= 2; + RecordAbilityBattle(targetBank, gBattleMons[targetBank].ability); + gSpecialStatuses[targetBank].lightningRodRedirected = 1; + } + } + break; + case 1: + case 8: + case 32: + case 64: + targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); + if (gAbsentBankFlags & gBitTable[targetBank]) + targetBank ^= 2; + break; + case 4: + side = GetBankSide(gBankAttacker) ^ 1; + if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + targetBank = gSideTimers[side].followmeTarget; + else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & 4) + { + if (GetBankSide(gBankAttacker) == 0) + { + if (Random() & 1) + targetBank = GetBankByIdentity(1); + else + targetBank = GetBankByIdentity(3); + } + else + { + if (Random() & 1) + targetBank = GetBankByIdentity(0); + else + targetBank = GetBankByIdentity(2); + } + if (gAbsentBankFlags & gBitTable[targetBank]) + targetBank ^= 2; + } + else + targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1); + break; + case 2: + case 16: + targetBank = gBankAttacker; + break; + } + ewram16010arr(gBankAttacker) = targetBank; + return targetBank; +} + +u8 IsMonDisobedient(void) +{ + u8 obedienceLevel; + s32 rnd; + s32 calc; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK + || GetBankSide(gBankAttacker) == 1 + || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName) + || FlagGet(FLAG_BADGE08_GET)) + return 0; + + obedienceLevel = 10; + if (FlagGet(FLAG_BADGE02_GET)) + obedienceLevel = 30; + if (FlagGet(FLAG_BADGE04_GET)) + obedienceLevel = 50; + if (FlagGet(FLAG_BADGE06_GET)) + obedienceLevel = 70; + + if (gBattleMons[gBankAttacker].level <= obedienceLevel) + return 0; + rnd = (Random() & 255); + calc = (gBattleMons[gBankAttacker].level + obedienceLevel) * rnd >> 8; + if (calc < obedienceLevel) + return 0; + + // is not obedient + if (gCurrentMove == MOVE_RAGE) + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RAGE); + if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK)) + { + gBattlescriptCurrInstr = gUnknown_081D995F; + return 1; + } + + rnd = (Random() & 255); + calc = (gBattleMons[gBankAttacker].level + obedienceLevel) * rnd >> 8; + if (calc < obedienceLevel) + { + calc = CheckMoveLimitations(gBankAttacker, gBitTable[gCurrMovePos], 0xFF); + if (calc == 0xF) // all moves cannot be used + { + gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; + gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; + return 1; + } + else // use a random move + { + do + { + gCurrMovePos = gUnknown_02024BE5 = Random() & 3; + } while (gBitTable[gCurrMovePos] & calc); + gRandomMove = gBattleMons[gBankAttacker].moves[gCurrMovePos]; + gBattleCommunication[3] = 0; + gDynamicBasePower = 0; + BATTLE_STRUCT->dynamicMoveType = 0; + gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; + gBankTarget = GetMoveTarget(gRandomMove, 0); + gHitMarker |= HITMARKER_x200000; + return 2; + } + } + else + { + obedienceLevel = gBattleMons[gBankAttacker].level - obedienceLevel; + + calc = (Random() & 255); + if (calc < obedienceLevel && !(gBattleMons[gBankAttacker].status1 & STATUS_ANY) && gBattleMons[gBankAttacker].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gBankAttacker].ability != ABILITY_INSOMNIA) + { + // try putting asleep + int i; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleMons[i].status2 & STATUS2_UPROAR) + break; + } + if (i == gNoOfAllBanks) + { + gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; + return 1; + } + } + calc -= obedienceLevel; + if (calc < obedienceLevel) + { + gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker); + gBankTarget = gBankAttacker; + gBattlescriptCurrInstr = gUnknown_081D99A0; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + return 2; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; + gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; + return 1; + } + } +} diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h index d03038674..9cffca632 100644 --- a/src/data/pokemon/trainer_class_lookups.h +++ b/src/data/pokemon/trainer_class_lookups.h @@ -1,9 +1,5 @@ -// - -// - -#ifndef POKERUBY_FACILITY_CLASS_LOOKUPS_H -#define POKERUBY_FACILITY_CLASS_LOOKUPS_H +#ifndef POKERUBY_TRAINER_CLASS_LOOKUPS_H +#define POKERUBY_TRAINER_CLASS_LOOKUPS_H const u8 gTrainerClassToPicIndex[] = { TRAINER_PIC_ARCHIE, // AQUA_LEADER @@ -165,4 +161,4 @@ const u8 gTrainerClassToNameIndex[] = { TRAINER_CLASS_SIS_AND_BRO // SIS_AND_BRO }; -#endif //POKERUBY_FACILITY_CLASS_LOOKUPS_H +#endif //POKERUBY_TRAINER_CLASS_LOOKUPS_H diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c index 1b00ad96e..eb56974cd 100644 --- a/src/pokemon/pokemon_2.c +++ b/src/pokemon/pokemon_2.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_util.h" #include "data2.h" #include "event_data.h" #include "main.h" diff --git a/src/rom3.c b/src/rom3.c index cdc66989c..11239a681 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -5,6 +5,7 @@ #include "battle_anim.h" #include "battle_anim_81258BC.h" #include "battle_anim_8137220.h" +#include "battle_util.h" #include "cable_club.h" #include "constants/items.h" #include "link.h" @@ -582,7 +583,7 @@ void Emitcmd1(u8 a, u8 b, u8 c) PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); } -void EmitSetAttributes(u8 a, u8 b, u8 c, u8 d, void *e) +void EmitSetMonData(u8 a, u8 b, u8 c, u8 d, void *e) { int i; -- cgit v1.2.3