summaryrefslogtreecommitdiff
path: root/src/battle/battle_2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle/battle_2.c')
-rw-r--r--src/battle/battle_2.c3106
1 files changed, 3071 insertions, 35 deletions
diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c
index b0654950b..ae84e5585 100644
--- a/src/battle/battle_2.c
+++ b/src/battle/battle_2.c
@@ -1,12 +1,18 @@
#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 "battle_util.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"
@@ -14,6 +20,7 @@
#include "pokedex.h"
#include "pokemon.h"
#include "random.h"
+#include "roamer.h"
#include "rom3.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
@@ -21,14 +28,18 @@
#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"
#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,14 +67,16 @@ struct UnknownStruct12
extern const u16 gUnknown_08D004E0[];
extern const struct MonCoords gCastformFrontSpriteCoords[];
+extern u8 gStatStageRatios[][2];
+extern u8 gActionsByTurnOrder[4];
extern struct UnknownPokemonStruct2 gUnknown_02023A00[];
extern u8 gBattleBufferB[][0x200];
extern u8 gActiveBank;
extern u32 gBattleExecBuffer;
extern u8 gNoOfAllBanks;
extern u16 gBattlePartyID[];
-extern u8 gFightStateTracker;
-extern u8 gTurnOrder[];
+extern u8 gCurrentActionFuncId;
+extern u8 gBanksByTurnOrder[];
extern struct UnknownStruct12 gUnknown_02024AD0[];
extern u8 gObjectBankIDs[];
extern u16 gCurrentMove;
@@ -77,7 +90,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;
@@ -107,8 +120,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;
@@ -129,8 +142,52 @@ extern u16 gBattleWeather;
extern u32 gBattleMoveDamage;
extern struct BattlePokemon gBattleMons[];
extern u8 gBattleMoveFlags;
+extern 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 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[];
+
static void BattlePrepIntroSlide(void);
+void CheckFocusPunch_ClearVarsBeforeTurnStarts(void);
+void SetActionsAndBanksTurnOrder(void);
+static void TurnValuesCleanUp(u8);
+void SpecialStatusesClear(void);
+static void RunTurnActionsFunctions(void);
+void HandleEndTurn_FinishBattle();
+static void FreeResetData_ReturnToOvOrDoEvolutions(void);
+void TryEvolvePokemon(void);
+static void ReturnFromBattleToOverworld(void);
+static void WaitForEvoSceneToFinish(void);
void sub_800E7C4(void)
{
@@ -179,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;
@@ -468,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;
@@ -826,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;
@@ -837,7 +894,7 @@ void sub_800F298(void)
}
}
-void sub_800F808(void)
+void BattleMainCB2(void)
{
AnimateSprites();
BuildOamBuffer();
@@ -1001,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;
@@ -1155,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;
@@ -1526,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;
}
@@ -1534,7 +1591,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;
@@ -1787,7 +1844,7 @@ static void BattlePrepIntroSlide(void)
{
if (gBattleExecBuffer == 0)
{
- gActiveBank = GetBankByPlayerAI(0);
+ gActiveBank = GetBankByIdentity(0);
EmitIntroSlide(0, gBattleTerrain);
MarkBufferBankForExecution(gActiveBank);
gBattleMainFunc = sub_8011384;
@@ -1891,7 +1948,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);
@@ -1909,7 +1966,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);
@@ -1944,7 +2001,7 @@ void bc_battle_begin_message(void)
{
if (gBattleExecBuffer == 0)
{
- gActiveBank = GetBankByPlayerAI(1);
+ gActiveBank = GetBankByIdentity(1);
PrepareStringBattle(0, gActiveBank);
gBattleMainFunc = sub_8011800;
}
@@ -1963,7 +2020,7 @@ void sub_8011800(void)
{
if (gBattleExecBuffer == 0)
{
- PrepareStringBattle(1, GetBankByPlayerAI(1));
+ PrepareStringBattle(1, GetBankByIdentity(1));
gBattleMainFunc = sub_8011834;
}
}
@@ -2015,7 +2072,7 @@ void sub_8011970(void)
if (gBattleExecBuffer == 0)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
- PrepareStringBattle(1, GetBankByPlayerAI(0));
+ PrepareStringBattle(1, GetBankByIdentity(0));
gBattleMainFunc = sub_80119B4;
}
}
@@ -2075,13 +2132,13 @@ 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)
- sub_8012FBC(i, j);
+ if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 1) != 0)
+ SwapTurnOrder(i, j);
}
}
}
@@ -2092,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)
@@ -2104,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)
@@ -2123,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++)
@@ -2176,10 +2233,10 @@ void BattleTurnPassed(void)
if (TurnBasedEffects() != 0)
return;
}
- if (sub_80173A4() != 0)
+ if (HandleFaintedMonActions() != 0)
return;
ewram16059 = 0;
- if (sub_80170DC() != 0)
+ if (HandleWishPerishSongOnTurnEnd() != 0)
return;
TurnValuesCleanUp(0);
gHitMarker &= ~HITMARKER_NO_ATTACKSTRING;
@@ -2195,8 +2252,8 @@ void BattleTurnPassed(void)
gBattleCommunication[i] = 0;
if (gBattleOutcome != 0)
{
- gFightStateTracker = 12;
- gBattleMainFunc = sub_80138F0;
+ gCurrentActionFuncId = 12;
+ gBattleMainFunc = RunTurnActionsFunctions;
return;
}
if (gBattleResults.battleTurnCounter < 0xFF)
@@ -2319,8 +2376,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])
@@ -2352,3 +2409,2982 @@ 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 GetBankByIdentity\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 GetBankByIdentity\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 GetBankByIdentity\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 BattleScriptExecute\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 TrySetCantSelectMoveBattleScript\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 GetBankByIdentity\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 @ =SetActionsAndBanksTurnOrder\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 SetActionsAndBanksTurnOrder\n\
+ .syntax divided\n");
+}
+
+void SwapTurnOrder(u8 a, u8 b)
+{
+ int temp;
+
+ temp = gActionsByTurnOrder[a];
+ gActionsByTurnOrder[a] = gActionsByTurnOrder[b];
+ gActionsByTurnOrder[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.
+// 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;
+}
+
+void SetActionsAndBanksTurnOrder(void)
+{
+ s32 var = 0;
+ s32 i, j;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[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)
+ {
+ gActionsByTurnOrder[0] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[0] = gActiveBank;
+ var = 1;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (i != gActiveBank)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[i];
+ gBanksByTurnOrder[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)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[var] = gActiveBank;
+ var++;
+ }
+ }
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (gActionForBanks[gActiveBank] != ACTION_USE_ITEM && gActionForBanks[gActiveBank] != ACTION_SWITCH)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[var] = gActiveBank;
+ var++;
+ }
+ }
+ for (i = 0; i < gNoOfAllBanks - 1; i++)
+ {
+ for (j = i + 1; j < gNoOfAllBanks; j++)
+ {
+ 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);
+ }
+ }
+ }
+ }
+ }
+ 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))
+ {
+ BattleScriptExecute(BattleScript_FocusPunchSetUp);
+ return;
+ }
+ }
+ }
+
+ TryClearRageStatuses();
+ gCurrentTurnActionNumber = 0;
+ {
+ // something stupid needed to match
+ u8 zero;
+ gCurrentActionFuncId = gActionsByTurnOrder[(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 = BattleScript_LinkBattleWonOrLost;
+ 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 = 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;
+}