summaryrefslogtreecommitdiff
path: root/src/battle_3.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle_3.c')
-rw-r--r--src/battle_3.c6595
1 files changed, 6595 insertions, 0 deletions
diff --git a/src/battle_3.c b/src/battle_3.c
new file mode 100644
index 000000000..9bb9e333f
--- /dev/null
+++ b/src/battle_3.c
@@ -0,0 +1,6595 @@
+#include "global.h"
+#include "abilities.h"
+#include "battle.h"
+#include "moves.h"
+#include "item.h"
+#include "items.h"
+#include "hold_effects.h"
+#include "species.h"
+#include "pokemon.h"
+#include "data2.h"
+#include "rng.h"
+#include "text.h"
+#include "battle_move_effects.h"
+#include "string_util.h"
+#include "flags.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 gTurnOrder[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 gFightStateTracker;
+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 GetBankByPlayerAI(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);
+void sub_8013F54(void);
+void sub_8013FBC(void);
+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 gUnknown_081D9030[];
+extern u8 gUnknown_081D8F62[];
+extern u8 gUnknown_081D8FFF[];
+extern u8 gUnknown_081D8F7D[];
+extern u8 gUnknown_081D9016[];
+extern u8 gUnknown_081D9008[];
+extern u8 gUnknown_081D9041[];
+extern u8 gUnknown_081D950F[]; //uproar wakeup BS
+extern u8 gUnknown_081D957E[]; //uproar BS
+extern u8 BattleScript_ThrashConfuses[];
+extern u8 BattleScript_YawnMakesAsleep[];
+extern u8 BattleScript_FutureSightHits[];
+extern u8 BattleScript_PerishSongHits[];
+extern u8 BattleScript_PerishSongTimerGoesDown[];
+extern u8 gUnknown_081D8C72[];
+extern u8 gUnknown_081D8C7B[];
+
+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 gUnknown_081D901D[]; //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 gUnknown_081D9956[]; //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 gUnknown_081D9A44[]; //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 gUnknown_081D9A4A[]; //berry cure any status return
+
+extern u8 BattleScript_ItemHealHP_Ret[];
+
+extern u8 gUnknown_081D995F[]; //disobedient while asleep
+extern u8 gUnknown_081D996F[]; //disobedient, uses a random move
+extern u8 gUnknown_081D9989[]; //disobedient, went to sleep
+extern u8 gUnknown_081D99A0[]; //disobedient, hits itself
+
+#define CHOICED_MOVE(bank)(((u16*)(&ewram[bank * 2 + 0x160e8])))
+
+//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] = GetBankByPlayerAI((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2));
+ else
+ gBattleBufferB[gActiveBank][3] = GetBankByPlayerAI(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++)
+ {
+ gTurnOrder[i] = i;
+ }
+ for (i = 0; i < gNoOfAllBanks - 1; i++)
+ {
+ s32 j;
+ for (j = i + 1; j < gNoOfAllBanks; j++)
+ {
+ if (b_first_side(gTurnOrder[i], gTurnOrder[j], 0))
+ sub_8012FBC(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 (--gSideTimer[sideBank].reflectTimer == 0)
+ {
+
+ gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT;
+ b_call_bc_move_exec(gUnknown_081D9030);
+ 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 (--gSideTimer[sideBank].lightscreenTimer == 0)
+ {
+ gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN;
+ b_call_bc_move_exec(gUnknown_081D9030);
+ 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 (gSideTimer[sideBank].mistTimer && --gSideTimer[sideBank].mistTimer == 0)
+ {
+ gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST;
+ b_call_bc_move_exec(gUnknown_081D9030);
+ 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 (--gSideTimer[sideBank].safeguardTimer == 0)
+ {
+ gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD;
+ b_call_bc_move_exec(gUnknown_081D9041);
+ 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 = gTurnOrder[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(gUnknown_081D8F62);
+ 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 = gUnknown_081D8FFF;
+ }
+ else
+ gBattlescriptCurrInstr = gUnknown_081D8F7D;
+
+ BATTLE_STRUCT->animArg1 = 0xC;
+ 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 = gUnknown_081D9016;
+ }
+ else
+ gBattlescriptCurrInstr = gUnknown_081D9008;
+
+ 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 = gUnknown_081D8FFF;
+ }
+ else
+ gBattlescriptCurrInstr = gUnknown_081D8F7D;
+
+ BATTLE_STRUCT->animArg1 = 0xD;
+ 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 = gTurnOrder[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 = ewram[gActiveBank * 2 + 0x16004];
+ BATTLE_STRUCT->animArg2 = ewram[gActiveBank * 2 + 0x16005];
+ gBattleTextBuff1[0] = 0xFD;
+ gBattleTextBuff1[1] = 2;
+ gBattleTextBuff1[2] = ewram[gActiveBank * 2 + 0x16004];
+ gBattleTextBuff1[3] = ewram[gActiveBank * 2 + 0x16005];
+ 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] = ewram[gActiveBank * 2 + 0x16004];
+ gBattleTextBuff1[3] = ewram[gActiveBank * 2 + 0x16005];
+ 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(gUnknown_081D950F);
+ 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(gUnknown_081D957E);
+ 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_FutureSightHits);
+ return 1;
+ }
+ }
+ }
+ BATTLE_STRUCT->sub80170DC_Tracker = 1;
+ BATTLE_STRUCT->sub80170DC_Bank = 0;
+ case 1: // perish song
+ while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks)
+ {
+ gActiveBank = gBankAttacker = gTurnOrder[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 sub_80173A4_MAX_CASE 7
+
+bool8 sub_80173A4(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(gUnknown_081D8C72);
+ 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(gUnknown_081D8C7B);
+ 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 != sub_80173A4_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 = GetBankByPlayerAI(1);
+ r6 = GetBankByPlayerAI(3);
+ party = gEnemyParty;
+ }
+ else
+ {
+ r7 = GetBankByPlayerAI(0);
+ r6 = GetBankByPlayerAI(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 != ewram[r7 + 0x16068] && i != ewram[r6 + 0x16068])
+ 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;
+}
+
+#ifdef NONMATCHING
+
+struct Struct2017100
+{
+ u32 arr[4];
+};
+
+#define ewram17100 (*(struct Struct2017100 *)(ewram + 0x17100))
+
+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?
+ {
+ //_08018436
+ int i; // r4
+ u16 move;
+ // Hmm...
+ #define moveType moveArg
+ //u16 moveType;
+ u8 side;
+
+ 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 3:
+ case 5:
+ case 13:
+ if (!(gBattleWeather & WEATHER_RAIN_ANY))
+ {
+ gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT);
+ BATTLE_STRUCT->animArg1 = 0xA;
+ BATTLE_STRUCT->scriptingActive = bank;
+ effect++;
+ }
+ break;
+ case 8:
+ if (!(gBattleWeather & WEATHER_SANDSTORM_ANY))
+ {
+ gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
+ BATTLE_STRUCT->animArg1 = 0xC;
+ BATTLE_STRUCT->scriptingActive = bank;
+ effect++;
+ }
+ break;
+ case 12:
+ if (!(gBattleWeather & WEATHER_SUN_ANY))
+ {
+ gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
+ BATTLE_STRUCT->animArg1 = 0xB;
+ BATTLE_STRUCT->scriptingActive = bank;
+ effect++;
+ }
+ break;
+ }
+ if (effect)
+ {
+ gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current();
+ b_push_move_exec(gUnknown_081D901D);
+ }
+ 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
+ {
+ u8 i;
+
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ // TODO: i should be in r6 here
+ //asm("":::"r4","r5");
+ effect = CastformDataTypeChange(i);
+ if (effect != 0)
+ {
+ b_push_move_exec(BattleScript_CastformChange);
+ BATTLE_STRUCT->scriptingActive = i;
+ 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;
+ //gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); fixed in Emerald
+ 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 (!(ewram17100.arr[bank] & 1))
+ {
+ gBattleCommunication[MULTISTRING_CHOOSER] = 0;
+ if (gProtectStructs[gBankAttacker].notFirstStrike)
+ gBattlescriptCurrInstr = BattleScript_FlashFireBoost;
+ else
+ gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss;
+ ewram17100.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;
+ else
+ gBattlescriptCurrInstr = BattleScript_MoveHPDrain_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
+ {
+ #define i bank
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ switch (gBattleMons[i].ability)
+ {
+ case ABILITY_IMMUNITY:
+ if (gBattleMons[i].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00)) // TODO: what is 0xF00?
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_OWN_TEMPO:
+ if (gBattleMons[i].status2 & STATUS2_CONFUSION)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
+ effect = 2;
+ }
+ break;
+ case ABILITY_LIMBER:
+ if (gBattleMons[i].status1 & STATUS_PARALYSIS)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_INSOMNIA:
+ case ABILITY_VITAL_SPIRIT:
+ if (gBattleMons[i].status1 & STATUS_SLEEP)
+ {
+ gBattleMons[i].status2 &= ~(STATUS2_NIGHTMARE);
+ StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_WATER_VEIL:
+ if (gBattleMons[i].status1 & STATUS_BURN)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_MAGMA_ARMOR:
+ if (gBattleMons[i].status1 & STATUS_FREEZE)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_OBLIVIOUS:
+ if (gBattleMons[i].status2 & STATUS2_INFATUATION)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
+ effect = 3;
+ }
+ break;
+ }
+ if (effect)
+ {
+ switch (effect)
+ {
+ case 1: // status cleared
+ gBattleMons[i].status1 = 0;
+ break;
+ case 2: // get rid of confusion
+ gBattleMons[i].status2 &= ~(STATUS2_CONFUSION);
+ break;
+ case 3: // get rid of infatuation
+ gBattleMons[i].status2 &= ~(STATUS2_INFATUATION);
+ break;
+ }
+ b_movescr_stack_push_cursor();
+ gBattlescriptCurrInstr = gUnknown_081D9956;
+ BATTLE_STRUCT->scriptingActive = i;
+ gActiveBank = i;
+ EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ MarkBufferBankForExecution(gActiveBank);
+ return effect;
+ }
+ }
+ #undef i
+ }
+ break;
+ case ABILITYEFFECT_FORECAST: // 6
+ //_080197B4
+ {
+ #define i bank
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (gBattleMons[i].ability == ABILITY_FORECAST)
+ {
+ effect = CastformDataTypeChange(i);
+ if (effect)
+ {
+ b_push_move_exec(BattleScript_CastformChange);
+ BATTLE_STRUCT->scriptingActive = i;
+ BATTLE_STRUCT->castformToChangeInto = effect - 1;
+ return effect;
+ }
+ }
+ }
+ #undef i
+ }
+ 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 opposite = (GetBankIdentity(i) ^ 1) & 1;
+ u8 target1 = GetBankByPlayerAI(opposite);
+ u8 target2 = GetBankByPlayerAI(opposite + 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) | opposite);
+ 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;
+}
+
+#else
+__attribute__((naked))
+u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
+{
+ 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, 0x28\n\
+ ldr r4, [sp, 0x48]\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x4]\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r10, r1\n\
+ lsls r2, 24\n\
+ lsrs r6, r2, 24\n\
+ lsls r3, 24\n\
+ lsrs r3, 24\n\
+ mov r8, r3\n\
+ lsls r4, 16\n\
+ lsrs r4, 16\n\
+ movs r0, 0\n\
+ mov r9, r0\n\
+ ldr r5, _08018380 @ =gBankAttacker\n\
+ ldr r1, _08018384 @ =gNoOfAllBanks\n\
+ ldrb r0, [r5]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bcc _08018360\n\
+ mov r1, r10\n\
+ strb r1, [r5]\n\
+_08018360:\n\
+ ldrb r0, [r5]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08018390\n\
+ ldr r1, _08018388 @ =gBattlePartyID\n\
+ ldrb r0, [r5]\n\
+ lsls r0, 1\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x64\n\
+ muls r1, r0\n\
+ ldr r0, _0801838C @ =gPlayerParty\n\
+ b _080183A0\n\
+ .align 2, 0\n\
+_08018380: .4byte gBankAttacker\n\
+_08018384: .4byte gNoOfAllBanks\n\
+_08018388: .4byte gBattlePartyID\n\
+_0801838C: .4byte gPlayerParty\n\
+_08018390:\n\
+ ldr r1, _080183D0 @ =gBattlePartyID\n\
+ ldrb r0, [r5]\n\
+ lsls r0, 1\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x64\n\
+ muls r1, r0\n\
+ ldr r0, _080183D4 @ =gEnemyParty\n\
+_080183A0:\n\
+ adds r7, r1, r0\n\
+ ldr r5, _080183D8 @ =gBankTarget\n\
+ ldr r1, _080183DC @ =gNoOfAllBanks\n\
+ ldrb r0, [r5]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bcc _080183B2\n\
+ mov r2, r10\n\
+ strb r2, [r5]\n\
+_080183B2:\n\
+ ldrb r0, [r5]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080183E4\n\
+ ldr r1, _080183D0 @ =gBattlePartyID\n\
+ ldrb r0, [r5]\n\
+ lsls r0, 1\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x64\n\
+ muls r1, r0\n\
+ ldr r0, _080183E0 @ =gPlayerParty\n\
+ b _080183F4\n\
+ .align 2, 0\n\
+_080183D0: .4byte gBattlePartyID\n\
+_080183D4: .4byte gEnemyParty\n\
+_080183D8: .4byte gBankTarget\n\
+_080183DC: .4byte gNoOfAllBanks\n\
+_080183E0: .4byte gPlayerParty\n\
+_080183E4:\n\
+ ldr r1, _08018444 @ =gBattlePartyID\n\
+ ldrb r0, [r5]\n\
+ lsls r0, 1\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x64\n\
+ muls r1, r0\n\
+ ldr r0, _08018448 @ =gEnemyParty\n\
+_080183F4:\n\
+ adds r5, r1, r0\n\
+ adds r0, r7, 0\n\
+ movs r1, 0xB\n\
+ bl GetMonData\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ movs r1, 0\n\
+ bl GetMonData\n\
+ str r0, [sp, 0x10]\n\
+ adds r0, r5, 0\n\
+ movs r1, 0xB\n\
+ bl GetMonData\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0xC]\n\
+ adds r0, r5, 0\n\
+ movs r1, 0\n\
+ bl GetMonData\n\
+ str r0, [sp, 0x14]\n\
+ ldr r0, _0801844C @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018436\n\
+ bl _08019F92\n\
+_08018436:\n\
+ mov r3, r8\n\
+ cmp r3, 0\n\
+ beq _08018454\n\
+ ldr r0, _08018450 @ =gLastUsedAbility\n\
+ strb r3, [r0]\n\
+ mov r8, r0\n\
+ b _0801846A\n\
+ .align 2, 0\n\
+_08018444: .4byte gBattlePartyID\n\
+_08018448: .4byte gEnemyParty\n\
+_0801844C: .4byte gBattleTypeFlags\n\
+_08018450: .4byte gLastUsedAbility\n\
+_08018454:\n\
+ ldr r2, _08018474 @ =gLastUsedAbility\n\
+ ldr r1, _08018478 @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r5, r10\n\
+ muls r5, r0\n\
+ adds r0, r5, 0\n\
+ adds r0, r1\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2]\n\
+ mov r8, r2\n\
+_0801846A:\n\
+ cmp r4, 0\n\
+ beq _0801847C\n\
+ adds r3, r4, 0\n\
+ b _08018480\n\
+ .align 2, 0\n\
+_08018474: .4byte gLastUsedAbility\n\
+_08018478: .4byte gBattleMons\n\
+_0801847C:\n\
+ ldr r0, _08018494 @ =gCurrentMove\n\
+ ldrh r3, [r0]\n\
+_08018480:\n\
+ ldr r1, _08018498 @ =0x02000000\n\
+ ldr r2, _0801849C @ =0x0001601c\n\
+ adds r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ adds r7, r1, 0\n\
+ cmp r0, 0\n\
+ beq _080184A0\n\
+ movs r4, 0x3F\n\
+ ands r4, r0\n\
+ b _080184AC\n\
+ .align 2, 0\n\
+_08018494: .4byte gCurrentMove\n\
+_08018498: .4byte 0x02000000\n\
+_0801849C: .4byte 0x0001601c\n\
+_080184A0:\n\
+ ldr r1, _080184C0 @ =gBattleMoves\n\
+ lsls r0, r3, 1\n\
+ adds r0, r3\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r4, [r0, 0x2]\n\
+_080184AC:\n\
+ ldr r5, [sp, 0x4]\n\
+ cmp r5, 0x13\n\
+ bls _080184B6\n\
+ bl _08019F76\n\
+_080184B6:\n\
+ lsls r0, r5, 2\n\
+ ldr r1, _080184C4 @ =_080184C8\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_080184C0: .4byte gBattleMoves\n\
+_080184C4: .4byte _080184C8\n\
+ .align 2, 0\n\
+_080184C8:\n\
+ .4byte _08018518\n\
+ .4byte _08018814\n\
+ .4byte _08018A40\n\
+ .4byte _08018AD8\n\
+ .4byte _08018CF0\n\
+ .4byte _08019448\n\
+ .4byte _080197B4\n\
+ .4byte _08019804\n\
+ .4byte _08019880\n\
+ .4byte _080198FC\n\
+ .4byte _08019B1C\n\
+ .4byte _08019940\n\
+ .4byte _08019B60\n\
+ .4byte _08019BBC\n\
+ .4byte _08019C18\n\
+ .4byte _08019D18\n\
+ .4byte _08019D5C\n\
+ .4byte _08019DB8\n\
+ .4byte _08019F44\n\
+ .4byte _08019CD4\n\
+_08018518:\n\
+ ldr r2, _0801854C @ =gBankAttacker\n\
+ ldr r0, _08018550 @ =gNoOfAllBanks\n\
+ ldrb r1, [r2]\n\
+ adds r5, r0, 0\n\
+ ldrb r0, [r5]\n\
+ cmp r1, r0\n\
+ bcc _0801852A\n\
+ mov r1, r10\n\
+ strb r1, [r2]\n\
+_0801852A:\n\
+ mov r2, r8\n\
+ ldrb r0, [r2]\n\
+ cmp r0, 0x2D\n\
+ bne _08018534\n\
+ b _080186B8\n\
+_08018534:\n\
+ cmp r0, 0x2D\n\
+ bgt _08018564\n\
+ cmp r0, 0xD\n\
+ bne _0801853E\n\
+ b _080187DC\n\
+_0801853E:\n\
+ cmp r0, 0xD\n\
+ bgt _08018554\n\
+ cmp r0, 0x2\n\
+ bne _08018548\n\
+ b _08018680\n\
+_08018548:\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_0801854C: .4byte gBankAttacker\n\
+_08018550: .4byte gNoOfAllBanks\n\
+_08018554:\n\
+ cmp r0, 0x16\n\
+ bne _0801855A\n\
+ b _08018728\n\
+_0801855A:\n\
+ cmp r0, 0x24\n\
+ bne _08018560\n\
+ b _080187A0\n\
+_08018560:\n\
+ bl _08019F76\n\
+_08018564:\n\
+ cmp r0, 0x46\n\
+ bne _0801856A\n\
+ b _080186F0\n\
+_0801856A:\n\
+ cmp r0, 0x46\n\
+ bgt _08018578\n\
+ cmp r0, 0x3B\n\
+ bne _08018574\n\
+ b _0801875C\n\
+_08018574:\n\
+ bl _08019F76\n\
+_08018578:\n\
+ cmp r0, 0x4D\n\
+ bne _0801857E\n\
+ b _080187DC\n\
+_0801857E:\n\
+ cmp r0, 0xFF\n\
+ beq _08018586\n\
+ bl _08019F76\n\
+_08018586:\n\
+ bl weather_get_current\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ subs r0, 0x3\n\
+ cmp r0, 0xA\n\
+ bhi _0801864C\n\
+ lsls r0, 2\n\
+ ldr r1, _080185A0 @ =_080185A4\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_080185A0: .4byte _080185A4\n\
+ .align 2, 0\n\
+_080185A4:\n\
+ .4byte _080185D0\n\
+ .4byte _0801864C\n\
+ .4byte _080185D0\n\
+ .4byte _0801864C\n\
+ .4byte _0801864C\n\
+ .4byte _080185F8\n\
+ .4byte _0801864C\n\
+ .4byte _0801864C\n\
+ .4byte _0801864C\n\
+ .4byte _08018620\n\
+ .4byte _080185D0\n\
+_080185D0:\n\
+ ldr r2, _080185EC @ =gBattleWeather\n\
+ ldrh r1, [r2]\n\
+ movs r0, 0x7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0801864C\n\
+ movs r0, 0x5\n\
+ strh r0, [r2]\n\
+ ldr r0, _080185F0 @ =0x02000000\n\
+ ldr r3, _080185F4 @ =0x000160a4\n\
+ adds r2, r0, r3\n\
+ movs r1, 0xA\n\
+ b _08018638\n\
+ .align 2, 0\n\
+_080185EC: .4byte gBattleWeather\n\
+_080185F0: .4byte 0x02000000\n\
+_080185F4: .4byte 0x000160a4\n\
+_080185F8:\n\
+ ldr r3, _08018614 @ =gBattleWeather\n\
+ ldrh r1, [r3]\n\
+ movs r2, 0x18\n\
+ adds r0, r2, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0801864C\n\
+ strh r2, [r3]\n\
+ ldr r0, _08018618 @ =0x02000000\n\
+ ldr r3, _0801861C @ =0x000160a4\n\
+ adds r2, r0, r3\n\
+ movs r1, 0xC\n\
+ b _08018638\n\
+ .align 2, 0\n\
+_08018614: .4byte gBattleWeather\n\
+_08018618: .4byte 0x02000000\n\
+_0801861C: .4byte 0x000160a4\n\
+_08018620:\n\
+ ldr r3, _08018668 @ =gBattleWeather\n\
+ ldrh r1, [r3]\n\
+ movs r2, 0x60\n\
+ adds r0, r2, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0801864C\n\
+ strh r2, [r3]\n\
+ ldr r0, _0801866C @ =0x02000000\n\
+ ldr r3, _08018670 @ =0x000160a4\n\
+ adds r2, r0, r3\n\
+ movs r1, 0xB\n\
+_08018638:\n\
+ strb r1, [r2]\n\
+ ldr r5, _08018674 @ =0x00016003\n\
+ adds r0, r5\n\
+ mov r1, r10\n\
+ strb r1, [r0]\n\
+ mov r0, r9\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_0801864C:\n\
+ mov r2, r9\n\
+ cmp r2, 0\n\
+ bne _08018656\n\
+ bl _08019F92\n\
+_08018656:\n\
+ bl weather_get_current\n\
+ ldr r1, _08018678 @ =gBattleCommunication\n\
+ strb r0, [r1, 0x5]\n\
+ ldr r0, _0801867C @ =gUnknown_081D901D\n\
+ bl b_push_move_exec\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_08018668: .4byte gBattleWeather\n\
+_0801866C: .4byte 0x02000000\n\
+_08018670: .4byte 0x000160a4\n\
+_08018674: .4byte 0x00016003\n\
+_08018678: .4byte gBattleCommunication\n\
+_0801867C: .4byte gUnknown_081D901D\n\
+_08018680:\n\
+ ldr r2, _080186A8 @ =gBattleWeather\n\
+ ldrh r1, [r2]\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018690\n\
+ bl _08019F76\n\
+_08018690:\n\
+ movs r0, 0x5\n\
+ strh r0, [r2]\n\
+ ldr r0, _080186AC @ =BattleScript_DrizzleActivates\n\
+ bl b_push_move_exec\n\
+ ldr r0, _080186B0 @ =0x02000000\n\
+ ldr r3, _080186B4 @ =0x00016003\n\
+ adds r0, r3\n\
+ mov r5, r10\n\
+ strb r5, [r0]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_080186A8: .4byte gBattleWeather\n\
+_080186AC: .4byte BattleScript_DrizzleActivates\n\
+_080186B0: .4byte 0x02000000\n\
+_080186B4: .4byte 0x00016003\n\
+_080186B8:\n\
+ ldr r2, _080186E0 @ =gBattleWeather\n\
+ ldrh r1, [r2]\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080186C8\n\
+ bl _08019F76\n\
+_080186C8:\n\
+ movs r0, 0x18\n\
+ strh r0, [r2]\n\
+ ldr r0, _080186E4 @ =BattleScript_SandstreamActivates\n\
+ bl b_push_move_exec\n\
+ ldr r0, _080186E8 @ =0x02000000\n\
+ ldr r1, _080186EC @ =0x00016003\n\
+ adds r0, r1\n\
+ mov r2, r10\n\
+ strb r2, [r0]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_080186E0: .4byte gBattleWeather\n\
+_080186E4: .4byte BattleScript_SandstreamActivates\n\
+_080186E8: .4byte 0x02000000\n\
+_080186EC: .4byte 0x00016003\n\
+_080186F0:\n\
+ ldr r2, _08018718 @ =gBattleWeather\n\
+ ldrh r1, [r2]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018700\n\
+ bl _08019F76\n\
+_08018700:\n\
+ movs r0, 0x60\n\
+ strh r0, [r2]\n\
+ ldr r0, _0801871C @ =BattleScript_DroughtActivates\n\
+ bl b_push_move_exec\n\
+ ldr r0, _08018720 @ =0x02000000\n\
+ ldr r3, _08018724 @ =0x00016003\n\
+ adds r0, r3\n\
+ mov r5, r10\n\
+ strb r5, [r0]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_08018718: .4byte gBattleWeather\n\
+_0801871C: .4byte BattleScript_DroughtActivates\n\
+_08018720: .4byte 0x02000000\n\
+_08018724: .4byte 0x00016003\n\
+_08018728:\n\
+ ldr r0, _08018754 @ =gSpecialStatuses\n\
+ mov r1, r10\n\
+ lsls r2, r1, 2\n\
+ adds r1, r2, r1\n\
+ lsls r1, 2\n\
+ adds r3, r1, r0\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 28\n\
+ cmp r0, 0\n\
+ bge _08018740\n\
+ bl _08019F76\n\
+_08018740:\n\
+ ldr r1, _08018758 @ =gStatuses3\n\
+ adds r1, r2, r1\n\
+ ldr r0, [r1]\n\
+ movs r2, 0x80\n\
+ lsls r2, 12\n\
+ orrs r0, r2\n\
+ str r0, [r1]\n\
+ ldrb r0, [r3]\n\
+ movs r1, 0x8\n\
+ b _080187CA\n\
+ .align 2, 0\n\
+_08018754: .4byte gSpecialStatuses\n\
+_08018758: .4byte gStatuses3\n\
+_0801875C:\n\
+ mov r0, r10\n\
+ bl CastformDataTypeChange\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+ cmp r0, 0\n\
+ bne _08018770\n\
+ bl _08019F92\n\
+_08018770:\n\
+ ldr r0, _08018790 @ =BattleScript_CastformChange\n\
+ bl b_push_move_exec\n\
+ ldr r0, _08018794 @ =0x02000000\n\
+ ldr r2, _08018798 @ =0x00016003\n\
+ adds r1, r0, r2\n\
+ mov r3, r10\n\
+ strb r3, [r1]\n\
+ mov r1, r9\n\
+ subs r1, 0x1\n\
+ ldr r5, _0801879C @ =0x0001609b\n\
+ adds r0, r5\n\
+ strb r1, [r0]\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_08018790: .4byte BattleScript_CastformChange\n\
+_08018794: .4byte 0x02000000\n\
+_08018798: .4byte 0x00016003\n\
+_0801879C: .4byte 0x0001609b\n\
+_080187A0:\n\
+ ldr r0, _080187D4 @ =gSpecialStatuses\n\
+ mov r1, r10\n\
+ lsls r2, r1, 2\n\
+ adds r1, r2, r1\n\
+ lsls r1, 2\n\
+ adds r3, r1, r0\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 27\n\
+ cmp r0, 0\n\
+ bge _080187B8\n\
+ bl _08019F76\n\
+_080187B8:\n\
+ ldr r1, _080187D8 @ =gStatuses3\n\
+ adds r1, r2, r1\n\
+ ldr r0, [r1]\n\
+ movs r2, 0x80\n\
+ lsls r2, 13\n\
+ orrs r0, r2\n\
+ str r0, [r1]\n\
+ ldrb r0, [r3]\n\
+ movs r1, 0x10\n\
+_080187CA:\n\
+ orrs r0, r1\n\
+ strb r0, [r3]\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_080187D4: .4byte gSpecialStatuses\n\
+_080187D8: .4byte gStatuses3\n\
+_080187DC:\n\
+ movs r6, 0\n\
+ ldrb r5, [r5]\n\
+ cmp r6, r5\n\
+ bcc _080187E8\n\
+ bl _08019F76\n\
+_080187E8:\n\
+ adds r0, r6, 0\n\
+ bl CastformDataTypeChange\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+ cmp r0, 0\n\
+ beq _080187FC\n\
+ bl _08019E14\n\
+_080187FC:\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ ldr r0, _08018810 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r6, r0\n\
+ bcc _080187E8\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_08018810: .4byte gNoOfAllBanks\n\
+_08018814:\n\
+ ldr r2, _08018844 @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r1, r10\n\
+ muls r1, r0\n\
+ adds r4, r1, r2\n\
+ ldrh r0, [r4, 0x28]\n\
+ cmp r0, 0\n\
+ bne _08018828\n\
+ bl _08019F76\n\
+_08018828:\n\
+ ldr r0, _08018848 @ =gBankAttacker\n\
+ mov r3, r10\n\
+ strb r3, [r0]\n\
+ mov r3, r8\n\
+ ldrb r5, [r3]\n\
+ cmp r5, 0x2C\n\
+ beq _0801885A\n\
+ cmp r5, 0x2C\n\
+ bgt _0801884C\n\
+ cmp r5, 0x3\n\
+ bne _08018840\n\
+ b _080189B8\n\
+_08018840:\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_08018844: .4byte gBattleMons\n\
+_08018848: .4byte gBankAttacker\n\
+_0801884C:\n\
+ cmp r5, 0x36\n\
+ bne _08018852\n\
+ b _08018A18\n\
+_08018852:\n\
+ cmp r5, 0x3D\n\
+ beq _080188DC\n\
+ bl _08019F76\n\
+_0801885A:\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+ movs r0, 0x13\n\
+ movs r1, 0\n\
+ movs r2, 0xD\n\
+ movs r3, 0\n\
+ bl AbilityBattleEffects\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0\n\
+ beq _08018876\n\
+ bl _08019F76\n\
+_08018876:\n\
+ str r0, [sp]\n\
+ movs r0, 0x13\n\
+ movs r1, 0\n\
+ movs r2, 0x4D\n\
+ movs r3, 0\n\
+ bl AbilityBattleEffects\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0801888E\n\
+ bl _08019F76\n\
+_0801888E:\n\
+ ldr r0, _080188D0 @ =gBattleWeather\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0801889E\n\
+ bl _08019F76\n\
+_0801889E:\n\
+ ldrh r0, [r4, 0x2C]\n\
+ ldrh r1, [r4, 0x28]\n\
+ cmp r0, r1\n\
+ bhi _080188AA\n\
+ bl _08019F76\n\
+_080188AA:\n\
+ mov r2, r8\n\
+ strb r5, [r2]\n\
+ ldr r0, _080188D4 @ =BattleScript_RainDishActivates\n\
+ bl b_push_move_exec\n\
+ ldr r1, _080188D8 @ =gBattleMoveDamage\n\
+ ldrh r0, [r4, 0x2C]\n\
+ lsrs r0, 4\n\
+ str r0, [r1]\n\
+ cmp r0, 0\n\
+ bne _080188C4\n\
+ movs r0, 0x1\n\
+ str r0, [r1]\n\
+_080188C4:\n\
+ ldr r0, [r1]\n\
+ negs r0, r0\n\
+ str r0, [r1]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_080188D0: .4byte gBattleWeather\n\
+_080188D4: .4byte BattleScript_RainDishActivates\n\
+_080188D8: .4byte gBattleMoveDamage\n\
+_080188DC:\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x4C\n\
+ adds r5, r1, r0\n\
+ ldrb r0, [r5]\n\
+ cmp r0, 0\n\
+ bne _080188EC\n\
+ bl _08019F76\n\
+_080188EC:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x3\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ cmp r4, 0\n\
+ beq _08018906\n\
+ bl _08019F76\n\
+_08018906:\n\
+ ldr r0, [r5]\n\
+ movs r1, 0x88\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018918\n\
+ ldr r0, _08018990 @ =gBattleTextBuff1\n\
+ ldr r1, _08018994 @ =gStatusConditionString_PoisonJpn\n\
+ bl StringCopy\n\
+_08018918:\n\
+ ldr r0, [r5]\n\
+ movs r1, 0x7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0801892A\n\
+ ldr r0, _08018990 @ =gBattleTextBuff1\n\
+ ldr r1, _08018998 @ =gStatusConditionString_SleepJpn\n\
+ bl StringCopy\n\
+_0801892A:\n\
+ ldr r0, [r5]\n\
+ movs r1, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0801893C\n\
+ ldr r0, _08018990 @ =gBattleTextBuff1\n\
+ ldr r1, _0801899C @ =gStatusConditionString_ParalysisJpn\n\
+ bl StringCopy\n\
+_0801893C:\n\
+ ldr r0, [r5]\n\
+ movs r1, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0801894E\n\
+ ldr r0, _08018990 @ =gBattleTextBuff1\n\
+ ldr r1, _080189A0 @ =gStatusConditionString_BurnJpn\n\
+ bl StringCopy\n\
+_0801894E:\n\
+ ldr r0, [r5]\n\
+ movs r1, 0x20\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018960\n\
+ ldr r0, _08018990 @ =gBattleTextBuff1\n\
+ ldr r1, _080189A4 @ =gStatusConditionString_IceJpn\n\
+ bl StringCopy\n\
+_08018960:\n\
+ str r4, [r5]\n\
+ ldr r0, _080189A8 @ =0x02000000\n\
+ ldr r4, _080189AC @ =gActiveBank\n\
+ mov r3, r10\n\
+ strb r3, [r4]\n\
+ ldr r1, _080189B0 @ =0x00016003\n\
+ adds r0, r1\n\
+ strb r3, [r0]\n\
+ ldr r0, _080189B4 @ =BattleScript_ShedSkinActivates\n\
+ bl b_push_move_exec\n\
+ str r5, [sp]\n\
+ movs r0, 0\n\
+ movs r1, 0x28\n\
+ movs r2, 0\n\
+ movs r3, 0x4\n\
+ bl EmitSetAttributes\n\
+ ldrb r0, [r4]\n\
+ bl MarkBufferBankForExecution\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_08018990: .4byte gBattleTextBuff1\n\
+_08018994: .4byte gStatusConditionString_PoisonJpn\n\
+_08018998: .4byte gStatusConditionString_SleepJpn\n\
+_0801899C: .4byte gStatusConditionString_ParalysisJpn\n\
+_080189A0: .4byte gStatusConditionString_BurnJpn\n\
+_080189A4: .4byte gStatusConditionString_IceJpn\n\
+_080189A8: .4byte 0x02000000\n\
+_080189AC: .4byte gActiveBank\n\
+_080189B0: .4byte 0x00016003\n\
+_080189B4: .4byte BattleScript_ShedSkinActivates\n\
+_080189B8:\n\
+ ldrb r2, [r4, 0x1B]\n\
+ movs r0, 0x1B\n\
+ ldrsb r0, [r4, r0]\n\
+ cmp r0, 0xB\n\
+ ble _080189C6\n\
+ bl _08019F76\n\
+_080189C6:\n\
+ ldr r0, _08018A04 @ =gDisableStructs\n\
+ mov r3, r10\n\
+ lsls r1, r3, 3\n\
+ subs r1, r3\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x16]\n\
+ cmp r0, 0x2\n\
+ bne _080189DC\n\
+ bl _08019F76\n\
+_080189DC:\n\
+ adds r0, r2, 0x1\n\
+ movs r2, 0\n\
+ strb r0, [r4, 0x1B]\n\
+ ldr r5, _08018A08 @ =0x000160a4\n\
+ adds r1, r7, r5\n\
+ movs r0, 0x11\n\
+ strb r0, [r1]\n\
+ ldr r1, _08018A0C @ =0x000160a5\n\
+ adds r0, r7, r1\n\
+ strb r2, [r0]\n\
+ ldr r0, _08018A10 @ =BattleScript_SpeedBoostActivates\n\
+ bl b_push_move_exec\n\
+ ldr r2, _08018A14 @ =0x00016003\n\
+ adds r0, r7, r2\n\
+ mov r3, r10\n\
+ strb r3, [r0]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_08018A04: .4byte gDisableStructs\n\
+_08018A08: .4byte 0x000160a4\n\
+_08018A0C: .4byte 0x000160a5\n\
+_08018A10: .4byte BattleScript_SpeedBoostActivates\n\
+_08018A14: .4byte 0x00016003\n\
+_08018A18:\n\
+ ldr r2, _08018A3C @ =gDisableStructs\n\
+ ldrb r0, [r0]\n\
+ lsls r1, r0, 3\n\
+ subs r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ ldrb r3, [r1, 0x18]\n\
+ lsls r0, r3, 31\n\
+ lsrs r0, 31\n\
+ movs r2, 0x1\n\
+ eors r2, r0\n\
+ movs r0, 0x2\n\
+ negs r0, r0\n\
+ ands r0, r3\n\
+ orrs r0, r2\n\
+ strb r0, [r1, 0x18]\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_08018A3C: .4byte gDisableStructs\n\
+_08018A40:\n\
+ mov r5, r8\n\
+ ldrb r0, [r5]\n\
+ cmp r0, 0x2B\n\
+ beq _08018A4C\n\
+ bl _08019F76\n\
+_08018A4C:\n\
+ movs r4, 0\n\
+ ldr r0, _08018ABC @ =gSoundMovesTable\n\
+ ldrh r2, [r0]\n\
+ ldr r5, _08018AC0 @ =0x0000ffff\n\
+ adds r1, r0, 0\n\
+ cmp r2, r5\n\
+ bne _08018A5E\n\
+ bl _08019F76\n\
+_08018A5E:\n\
+ cmp r2, r3\n\
+ beq _08018A76\n\
+ adds r2, r1, 0\n\
+_08018A64:\n\
+ adds r2, 0x2\n\
+ adds r4, 0x1\n\
+ ldrh r0, [r2]\n\
+ cmp r0, r5\n\
+ bne _08018A72\n\
+ bl _08019F76\n\
+_08018A72:\n\
+ cmp r0, r3\n\
+ bne _08018A64\n\
+_08018A76:\n\
+ lsls r0, r4, 1\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _08018AC0 @ =0x0000ffff\n\
+ cmp r1, r0\n\
+ bne _08018A86\n\
+ bl _08019F76\n\
+_08018A86:\n\
+ ldr r1, _08018AC4 @ =gBattleMons\n\
+ ldr r0, _08018AC8 @ =gBankAttacker\n\
+ ldrb r2, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r1, 0x50\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x80\n\
+ lsls r1, 5\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018AAC\n\
+ ldr r0, _08018ACC @ =gHitMarker\n\
+ ldr r1, [r0]\n\
+ movs r2, 0x80\n\
+ lsls r2, 4\n\
+ orrs r1, r2\n\
+ str r1, [r0]\n\
+_08018AAC:\n\
+ ldr r1, _08018AD0 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018AD4 @ =BattleScript_SoundproofProtected\n\
+ str r0, [r1]\n\
+ movs r0, 0x1\n\
+ mov r9, r0\n\
+ bl _08019F7C\n\
+ .align 2, 0\n\
+_08018ABC: .4byte gSoundMovesTable\n\
+_08018AC0: .4byte 0x0000ffff\n\
+_08018AC4: .4byte gBattleMons\n\
+_08018AC8: .4byte gBankAttacker\n\
+_08018ACC: .4byte gHitMarker\n\
+_08018AD0: .4byte gBattlescriptCurrInstr\n\
+_08018AD4: .4byte BattleScript_SoundproofProtected\n\
+_08018AD8:\n\
+ cmp r3, 0\n\
+ bne _08018AE0\n\
+ bl _08019F76\n\
+_08018AE0:\n\
+ mov r1, r8\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0xB\n\
+ beq _08018B50\n\
+ cmp r0, 0xB\n\
+ bgt _08018AF2\n\
+ cmp r0, 0xA\n\
+ beq _08018AF8\n\
+ b _08018C6A\n\
+_08018AF2:\n\
+ cmp r0, 0x12\n\
+ beq _08018BA8\n\
+ b _08018C6A\n\
+_08018AF8:\n\
+ cmp r4, 0xD\n\
+ beq _08018AFE\n\
+ b _08018C6A\n\
+_08018AFE:\n\
+ ldr r0, _08018B28 @ =gBattleMoves\n\
+ lsls r1, r3, 1\n\
+ adds r1, r3\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ cmp r0, 0\n\
+ bne _08018B10\n\
+ b _08018C6A\n\
+_08018B10:\n\
+ ldr r1, _08018B2C @ =gProtectStructs\n\
+ ldr r0, _08018B30 @ =gBankAttacker\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 4\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x2]\n\
+ lsls r0, 28\n\
+ cmp r0, 0\n\
+ bge _08018B3C\n\
+ ldr r1, _08018B34 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018B38 @ =BattleScript_MoveHPDrain\n\
+ b _08018B40\n\
+ .align 2, 0\n\
+_08018B28: .4byte gBattleMoves\n\
+_08018B2C: .4byte gProtectStructs\n\
+_08018B30: .4byte gBankAttacker\n\
+_08018B34: .4byte gBattlescriptCurrInstr\n\
+_08018B38: .4byte BattleScript_MoveHPDrain\n\
+_08018B3C:\n\
+ ldr r1, _08018B48 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018B4C @ =BattleScript_MoveHPDrain_PPLoss\n\
+_08018B40:\n\
+ str r0, [r1]\n\
+ movs r2, 0x1\n\
+ b _08018C68\n\
+ .align 2, 0\n\
+_08018B48: .4byte gBattlescriptCurrInstr\n\
+_08018B4C: .4byte BattleScript_MoveHPDrain_PPLoss\n\
+_08018B50:\n\
+ cmp r4, 0xB\n\
+ beq _08018B56\n\
+ b _08018C6A\n\
+_08018B56:\n\
+ ldr r0, _08018B80 @ =gBattleMoves\n\
+ lsls r1, r3, 1\n\
+ adds r1, r3\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ cmp r0, 0\n\
+ bne _08018B68\n\
+ b _08018C6A\n\
+_08018B68:\n\
+ ldr r1, _08018B84 @ =gProtectStructs\n\
+ ldr r0, _08018B88 @ =gBankAttacker\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 4\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x2]\n\
+ lsls r0, 28\n\
+ cmp r0, 0\n\
+ bge _08018B94\n\
+ ldr r1, _08018B8C @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018B90 @ =BattleScript_MoveHPDrain\n\
+ b _08018B98\n\
+ .align 2, 0\n\
+_08018B80: .4byte gBattleMoves\n\
+_08018B84: .4byte gProtectStructs\n\
+_08018B88: .4byte gBankAttacker\n\
+_08018B8C: .4byte gBattlescriptCurrInstr\n\
+_08018B90: .4byte BattleScript_MoveHPDrain\n\
+_08018B94:\n\
+ ldr r1, _08018BA0 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018BA4 @ =BattleScript_MoveHPDrain_PPLoss\n\
+_08018B98:\n\
+ str r0, [r1]\n\
+ movs r3, 0x1\n\
+ mov r9, r3\n\
+ b _08018C6A\n\
+ .align 2, 0\n\
+_08018BA0: .4byte gBattlescriptCurrInstr\n\
+_08018BA4: .4byte BattleScript_MoveHPDrain_PPLoss\n\
+_08018BA8:\n\
+ cmp r4, 0xA\n\
+ bne _08018C6A\n\
+ ldr r1, _08018BF4 @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r5, r10\n\
+ muls r5, r0\n\
+ adds r0, r5, 0\n\
+ adds r1, 0x4C\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x20\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08018C6A\n\
+ ldr r2, _08018BF8 @ =0x02017100\n\
+ mov r0, r10\n\
+ lsls r1, r0, 2\n\
+ adds r0, r1, r2\n\
+ ldr r3, [r0]\n\
+ movs r4, 0x1\n\
+ ands r3, r4\n\
+ adds r5, r1, 0\n\
+ cmp r3, 0\n\
+ bne _08018C30\n\
+ ldr r0, _08018BFC @ =gBattleCommunication\n\
+ strb r3, [r0, 0x5]\n\
+ ldr r1, _08018C00 @ =gProtectStructs\n\
+ ldr r0, _08018C04 @ =gBankAttacker\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 4\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x2]\n\
+ lsls r0, 28\n\
+ cmp r0, 0\n\
+ bge _08018C10\n\
+ ldr r1, _08018C08 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018C0C @ =BattleScript_FlashFireBoost\n\
+ b _08018C14\n\
+ .align 2, 0\n\
+_08018BF4: .4byte gBattleMons\n\
+_08018BF8: .4byte 0x02017100\n\
+_08018BFC: .4byte gBattleCommunication\n\
+_08018C00: .4byte gProtectStructs\n\
+_08018C04: .4byte gBankAttacker\n\
+_08018C08: .4byte gBattlescriptCurrInstr\n\
+_08018C0C: .4byte BattleScript_FlashFireBoost\n\
+_08018C10:\n\
+ ldr r1, _08018C28 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018C2C @ =BattleScript_FlashFireBoost_PPLoss\n\
+_08018C14:\n\
+ str r0, [r1]\n\
+ adds r0, r5, r2\n\
+ ldr r1, [r0]\n\
+ movs r2, 0x1\n\
+ orrs r1, r2\n\
+ str r1, [r0]\n\
+ movs r1, 0x2\n\
+ mov r9, r1\n\
+ b _08018C6A\n\
+ .align 2, 0\n\
+_08018C28: .4byte gBattlescriptCurrInstr\n\
+_08018C2C: .4byte BattleScript_FlashFireBoost_PPLoss\n\
+_08018C30:\n\
+ ldr r0, _08018C4C @ =gBattleCommunication\n\
+ strb r4, [r0, 0x5]\n\
+ ldr r1, _08018C50 @ =gProtectStructs\n\
+ ldr r0, _08018C54 @ =gBankAttacker\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 4\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x2]\n\
+ lsls r0, 28\n\
+ cmp r0, 0\n\
+ bge _08018C60\n\
+ ldr r1, _08018C58 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018C5C @ =BattleScript_FlashFireBoost\n\
+ b _08018C64\n\
+ .align 2, 0\n\
+_08018C4C: .4byte gBattleCommunication\n\
+_08018C50: .4byte gProtectStructs\n\
+_08018C54: .4byte gBankAttacker\n\
+_08018C58: .4byte gBattlescriptCurrInstr\n\
+_08018C5C: .4byte BattleScript_FlashFireBoost\n\
+_08018C60:\n\
+ ldr r1, _08018CA4 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018CA8 @ =BattleScript_FlashFireBoost_PPLoss\n\
+_08018C64:\n\
+ str r0, [r1]\n\
+ movs r2, 0x2\n\
+_08018C68:\n\
+ mov r9, r2\n\
+_08018C6A:\n\
+ mov r3, r9\n\
+ cmp r3, 0x1\n\
+ beq _08018C74\n\
+ bl _08019F76\n\
+_08018C74:\n\
+ ldr r1, _08018CAC @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r5, r10\n\
+ muls r5, r0\n\
+ adds r0, r5, 0\n\
+ adds r1, r0, r1\n\
+ ldrh r0, [r1, 0x2C]\n\
+ ldrh r2, [r1, 0x28]\n\
+ cmp r0, r2\n\
+ bne _08018CD0\n\
+ ldr r1, _08018CB0 @ =gProtectStructs\n\
+ ldr r0, _08018CB4 @ =gBankAttacker\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 4\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x2]\n\
+ lsls r0, 28\n\
+ cmp r0, 0\n\
+ bge _08018CBC\n\
+ ldr r1, _08018CA4 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018CB8 @ =BattleScript_MoveHPDrain_FullHP\n\
+ str r0, [r1]\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_08018CA4: .4byte gBattlescriptCurrInstr\n\
+_08018CA8: .4byte BattleScript_FlashFireBoost_PPLoss\n\
+_08018CAC: .4byte gBattleMons\n\
+_08018CB0: .4byte gProtectStructs\n\
+_08018CB4: .4byte gBankAttacker\n\
+_08018CB8: .4byte BattleScript_MoveHPDrain_FullHP\n\
+_08018CBC:\n\
+ ldr r1, _08018CC8 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018CCC @ =BattleScript_MoveHPDrain_FullHP_PPLoss\n\
+ str r0, [r1]\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_08018CC8: .4byte gBattlescriptCurrInstr\n\
+_08018CCC: .4byte BattleScript_MoveHPDrain_FullHP_PPLoss\n\
+_08018CD0:\n\
+ ldr r2, _08018CEC @ =gBattleMoveDamage\n\
+ ldrh r0, [r1, 0x2C]\n\
+ lsrs r0, 2\n\
+ str r0, [r2]\n\
+ cmp r0, 0\n\
+ bne _08018CE0\n\
+ mov r3, r9\n\
+ str r3, [r2]\n\
+_08018CE0:\n\
+ ldr r0, [r2]\n\
+ negs r0, r0\n\
+ str r0, [r2]\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_08018CEC: .4byte gBattleMoveDamage\n\
+_08018CF0:\n\
+ mov r5, r8\n\
+ ldrb r0, [r5]\n\
+ subs r0, 0x9\n\
+ cmp r0, 0x2F\n\
+ bls _08018CFE\n\
+ bl _08019F76\n\
+_08018CFE:\n\
+ lsls r0, 2\n\
+ ldr r1, _08018D08 @ =_08018D0C\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_08018D08: .4byte _08018D0C\n\
+ .align 2, 0\n\
+_08018D0C:\n\
+ .4byte _08019128\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08018DCC\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08018E94\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08018F54\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _0801904C\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019204\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _08019F76\n\
+ .4byte _080192E0\n\
+_08018DCC:\n\
+ ldr r0, _08018E74 @ =gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x29\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018DDC\n\
+ bl _08019F76\n\
+_08018DDC:\n\
+ cmp r3, 0xA5\n\
+ bne _08018DE4\n\
+ bl _08019F76\n\
+_08018DE4:\n\
+ ldr r0, _08018E78 @ =gBattleMoves\n\
+ lsls r1, r3, 1\n\
+ adds r1, r3\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ cmp r0, 0\n\
+ bne _08018DF8\n\
+ bl _08019F76\n\
+_08018DF8:\n\
+ ldr r2, _08018E7C @ =gSpecialStatuses\n\
+ ldr r0, _08018E80 @ =gBankTarget\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r1, r0, 2\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x8\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08018E20\n\
+ adds r0, r2, 0\n\
+ adds r0, 0xC\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08018E20\n\
+ bl _08019F76\n\
+_08018E20:\n\
+ ldr r1, _08018E84 @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r2, r10\n\
+ muls r2, r0\n\
+ adds r0, r2, 0\n\
+ adds r1, r0, r1\n\
+ adds r3, r1, 0\n\
+ adds r3, 0x21\n\
+ ldrb r0, [r3]\n\
+ cmp r0, r4\n\
+ bne _08018E3A\n\
+ bl _08019F76\n\
+_08018E3A:\n\
+ adds r2, r1, 0\n\
+ adds r2, 0x22\n\
+ ldrb r0, [r2]\n\
+ cmp r0, r4\n\
+ bne _08018E48\n\
+ bl _08019F76\n\
+_08018E48:\n\
+ ldrh r0, [r1, 0x28]\n\
+ cmp r0, 0\n\
+ bne _08018E52\n\
+ bl _08019F76\n\
+_08018E52:\n\
+ strb r4, [r3]\n\
+ strb r4, [r2]\n\
+ ldr r1, _08018E88 @ =gBattleTextBuff1\n\
+ movs r0, 0xFD\n\
+ strb r0, [r1]\n\
+ movs r0, 0x3\n\
+ strb r0, [r1, 0x1]\n\
+ strb r4, [r1, 0x2]\n\
+ movs r0, 0xFF\n\
+ strb r0, [r1, 0x3]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _08018E8C @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018E90 @ =BattleScript_ColorChangeActivates\n\
+ str r0, [r1]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_08018E74: .4byte gBattleMoveFlags\n\
+_08018E78: .4byte gBattleMoves\n\
+_08018E7C: .4byte gSpecialStatuses\n\
+_08018E80: .4byte gBankTarget\n\
+_08018E84: .4byte gBattleMons\n\
+_08018E88: .4byte gBattleTextBuff1\n\
+_08018E8C: .4byte gBattlescriptCurrInstr\n\
+_08018E90: .4byte BattleScript_ColorChangeActivates\n\
+_08018E94:\n\
+ ldr r0, _08018F2C @ =gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x29\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018EA4\n\
+ bl _08019F76\n\
+_08018EA4:\n\
+ ldr r1, _08018F30 @ =gBattleMons\n\
+ ldr r0, _08018F34 @ =gBankAttacker\n\
+ ldrb r2, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r4, r0, r1\n\
+ ldrh r0, [r4, 0x28]\n\
+ cmp r0, 0\n\
+ bne _08018EBA\n\
+ bl _08019F76\n\
+_08018EBA:\n\
+ ldr r0, _08018F38 @ =gProtectStructs\n\
+ lsls r1, r2, 4\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ lsls r0, 31\n\
+ cmp r0, 0\n\
+ beq _08018ECC\n\
+ bl _08019F76\n\
+_08018ECC:\n\
+ ldr r2, _08018F3C @ =gSpecialStatuses\n\
+ ldr r0, _08018F40 @ =gBankTarget\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r1, r0, 2\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x8\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08018EF4\n\
+ adds r0, r2, 0\n\
+ adds r0, 0xC\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08018EF4\n\
+ bl _08019F76\n\
+_08018EF4:\n\
+ ldr r1, _08018F44 @ =gBattleMoves\n\
+ lsls r0, r3, 1\n\
+ adds r0, r3\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r1, [r0, 0x8]\n\
+ movs r2, 0x1\n\
+ adds r0, r2, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08018F0E\n\
+ bl _08019F76\n\
+_08018F0E:\n\
+ ldr r1, _08018F48 @ =gBattleMoveDamage\n\
+ ldrh r0, [r4, 0x2C]\n\
+ lsrs r0, 4\n\
+ str r0, [r1]\n\
+ cmp r0, 0\n\
+ bne _08018F1C\n\
+ str r2, [r1]\n\
+_08018F1C:\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _08018F4C @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08018F50 @ =BattleScript_RoughSkinActivates\n\
+ str r0, [r1]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_08018F2C: .4byte gBattleMoveFlags\n\
+_08018F30: .4byte gBattleMons\n\
+_08018F34: .4byte gBankAttacker\n\
+_08018F38: .4byte gProtectStructs\n\
+_08018F3C: .4byte gSpecialStatuses\n\
+_08018F40: .4byte gBankTarget\n\
+_08018F44: .4byte gBattleMoves\n\
+_08018F48: .4byte gBattleMoveDamage\n\
+_08018F4C: .4byte gBattlescriptCurrInstr\n\
+_08018F50: .4byte BattleScript_RoughSkinActivates\n\
+_08018F54:\n\
+ ldr r0, _08019020 @ =gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x29\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08018F64\n\
+ bl _08019F76\n\
+_08018F64:\n\
+ ldr r1, _08019024 @ =gBattleMons\n\
+ ldr r0, _08019028 @ =gBankAttacker\n\
+ ldrb r2, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x28]\n\
+ cmp r0, 0\n\
+ bne _08018F7A\n\
+ bl _08019F76\n\
+_08018F7A:\n\
+ ldr r0, _0801902C @ =gProtectStructs\n\
+ lsls r1, r2, 4\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ lsls r0, 31\n\
+ cmp r0, 0\n\
+ beq _08018F8C\n\
+ bl _08019F76\n\
+_08018F8C:\n\
+ ldr r2, _08019030 @ =gSpecialStatuses\n\
+ ldr r0, _08019034 @ =gBankTarget\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r1, r0, 2\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x8\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08018FB4\n\
+ adds r0, r2, 0\n\
+ adds r0, 0xC\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08018FB4\n\
+ bl _08019F76\n\
+_08018FB4:\n\
+ ldr r1, _08019038 @ =gBattleMoves\n\
+ lsls r0, r3, 1\n\
+ adds r0, r3\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r1, [r0, 0x8]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08018FCC\n\
+ bl _08019F76\n\
+_08018FCC:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0xA\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ beq _08018FE4\n\
+ bl _08019F76\n\
+_08018FE4:\n\
+ ldr r5, _0801903C @ =gBattleCommunication\n\
+ movs r4, 0x3\n\
+_08018FE8:\n\
+ bl Random\n\
+ ands r0, r4\n\
+ strb r0, [r5, 0x3]\n\
+ cmp r0, 0\n\
+ beq _08018FE8\n\
+ ldr r1, _0801903C @ =gBattleCommunication\n\
+ ldrb r0, [r1, 0x3]\n\
+ cmp r0, 0x3\n\
+ bne _08019000\n\
+ adds r0, 0x2\n\
+ strb r0, [r1, 0x3]\n\
+_08019000:\n\
+ ldrb r0, [r1, 0x3]\n\
+ adds r0, 0x40\n\
+ strb r0, [r1, 0x3]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _08019040 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08019044 @ =BattleScript_ApplySecondaryEffect\n\
+ str r0, [r1]\n\
+ ldr r2, _08019048 @ =gHitMarker\n\
+ ldr r0, [r2]\n\
+ movs r1, 0x80\n\
+ lsls r1, 6\n\
+ orrs r0, r1\n\
+ str r0, [r2]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_08019020: .4byte gBattleMoveFlags\n\
+_08019024: .4byte gBattleMons\n\
+_08019028: .4byte gBankAttacker\n\
+_0801902C: .4byte gProtectStructs\n\
+_08019030: .4byte gSpecialStatuses\n\
+_08019034: .4byte gBankTarget\n\
+_08019038: .4byte gBattleMoves\n\
+_0801903C: .4byte gBattleCommunication\n\
+_08019040: .4byte gBattlescriptCurrInstr\n\
+_08019044: .4byte BattleScript_ApplySecondaryEffect\n\
+_08019048: .4byte gHitMarker\n\
+_0801904C:\n\
+ ldr r0, _080190FC @ =gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x29\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0801905C\n\
+ bl _08019F76\n\
+_0801905C:\n\
+ ldr r1, _08019100 @ =gBattleMons\n\
+ ldr r0, _08019104 @ =gBankAttacker\n\
+ ldrb r2, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x28]\n\
+ cmp r0, 0\n\
+ bne _08019072\n\
+ bl _08019F76\n\
+_08019072:\n\
+ ldr r0, _08019108 @ =gProtectStructs\n\
+ lsls r1, r2, 4\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ lsls r0, 31\n\
+ cmp r0, 0\n\
+ beq _08019084\n\
+ bl _08019F76\n\
+_08019084:\n\
+ ldr r2, _0801910C @ =gSpecialStatuses\n\
+ ldr r0, _08019110 @ =gBankTarget\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r1, r0, 2\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x8\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080190AC\n\
+ adds r0, r2, 0\n\
+ adds r0, 0xC\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080190AC\n\
+ bl _08019F76\n\
+_080190AC:\n\
+ ldr r1, _08019114 @ =gBattleMoves\n\
+ lsls r0, r3, 1\n\
+ adds r0, r3\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r1, [r0, 0x8]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080190C4\n\
+ bl _08019F76\n\
+_080190C4:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x3\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ beq _080190DC\n\
+ bl _08019F76\n\
+_080190DC:\n\
+ ldr r1, _08019118 @ =gBattleCommunication\n\
+ movs r0, 0x42\n\
+ strb r0, [r1, 0x3]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _0801911C @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08019120 @ =BattleScript_ApplySecondaryEffect\n\
+ str r0, [r1]\n\
+ ldr r2, _08019124 @ =gHitMarker\n\
+ ldr r0, [r2]\n\
+ movs r1, 0x80\n\
+ lsls r1, 6\n\
+ orrs r0, r1\n\
+ str r0, [r2]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_080190FC: .4byte gBattleMoveFlags\n\
+_08019100: .4byte gBattleMons\n\
+_08019104: .4byte gBankAttacker\n\
+_08019108: .4byte gProtectStructs\n\
+_0801910C: .4byte gSpecialStatuses\n\
+_08019110: .4byte gBankTarget\n\
+_08019114: .4byte gBattleMoves\n\
+_08019118: .4byte gBattleCommunication\n\
+_0801911C: .4byte gBattlescriptCurrInstr\n\
+_08019120: .4byte BattleScript_ApplySecondaryEffect\n\
+_08019124: .4byte gHitMarker\n\
+_08019128:\n\
+ ldr r0, _080191D8 @ =gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x29\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08019138\n\
+ bl _08019F76\n\
+_08019138:\n\
+ ldr r1, _080191DC @ =gBattleMons\n\
+ ldr r0, _080191E0 @ =gBankAttacker\n\
+ ldrb r2, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x28]\n\
+ cmp r0, 0\n\
+ bne _0801914E\n\
+ bl _08019F76\n\
+_0801914E:\n\
+ ldr r0, _080191E4 @ =gProtectStructs\n\
+ lsls r1, r2, 4\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ lsls r0, 31\n\
+ cmp r0, 0\n\
+ beq _08019160\n\
+ bl _08019F76\n\
+_08019160:\n\
+ ldr r2, _080191E8 @ =gSpecialStatuses\n\
+ ldr r0, _080191EC @ =gBankTarget\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r1, r0, 2\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x8\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08019188\n\
+ adds r0, r2, 0\n\
+ adds r0, 0xC\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08019188\n\
+ bl _08019F76\n\
+_08019188:\n\
+ ldr r1, _080191F0 @ =gBattleMoves\n\
+ lsls r0, r3, 1\n\
+ adds r0, r3\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r1, [r0, 0x8]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080191A0\n\
+ bl _08019F76\n\
+_080191A0:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x3\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ beq _080191B8\n\
+ bl _08019F76\n\
+_080191B8:\n\
+ ldr r1, _080191F4 @ =gBattleCommunication\n\
+ movs r0, 0x45\n\
+ strb r0, [r1, 0x3]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _080191F8 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _080191FC @ =BattleScript_ApplySecondaryEffect\n\
+ str r0, [r1]\n\
+ ldr r2, _08019200 @ =gHitMarker\n\
+ ldr r0, [r2]\n\
+ movs r1, 0x80\n\
+ lsls r1, 6\n\
+ orrs r0, r1\n\
+ str r0, [r2]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_080191D8: .4byte gBattleMoveFlags\n\
+_080191DC: .4byte gBattleMons\n\
+_080191E0: .4byte gBankAttacker\n\
+_080191E4: .4byte gProtectStructs\n\
+_080191E8: .4byte gSpecialStatuses\n\
+_080191EC: .4byte gBankTarget\n\
+_080191F0: .4byte gBattleMoves\n\
+_080191F4: .4byte gBattleCommunication\n\
+_080191F8: .4byte gBattlescriptCurrInstr\n\
+_080191FC: .4byte BattleScript_ApplySecondaryEffect\n\
+_08019200: .4byte gHitMarker\n\
+_08019204:\n\
+ ldr r0, _080192B4 @ =gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x29\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08019214\n\
+ bl _08019F76\n\
+_08019214:\n\
+ ldr r1, _080192B8 @ =gBattleMons\n\
+ ldr r0, _080192BC @ =gBankAttacker\n\
+ ldrb r2, [r0]\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x28]\n\
+ cmp r0, 0\n\
+ bne _0801922A\n\
+ bl _08019F76\n\
+_0801922A:\n\
+ ldr r0, _080192C0 @ =gProtectStructs\n\
+ lsls r1, r2, 4\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ lsls r0, 31\n\
+ cmp r0, 0\n\
+ beq _0801923C\n\
+ bl _08019F76\n\
+_0801923C:\n\
+ ldr r1, _080192C4 @ =gBattleMoves\n\
+ lsls r0, r3, 1\n\
+ adds r0, r3\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r1, [r0, 0x8]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08019254\n\
+ bl _08019F76\n\
+_08019254:\n\
+ ldr r2, _080192C8 @ =gSpecialStatuses\n\
+ ldr r0, _080192CC @ =gBankTarget\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r1, r0, 2\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x8\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _0801927C\n\
+ adds r0, r2, 0\n\
+ adds r0, 0xC\n\
+ adds r0, r1, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _0801927C\n\
+ bl _08019F76\n\
+_0801927C:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x3\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ beq _08019294\n\
+ bl _08019F76\n\
+_08019294:\n\
+ ldr r1, _080192D0 @ =gBattleCommunication\n\
+ movs r0, 0x43\n\
+ strb r0, [r1, 0x3]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _080192D4 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _080192D8 @ =BattleScript_ApplySecondaryEffect\n\
+ str r0, [r1]\n\
+ ldr r2, _080192DC @ =gHitMarker\n\
+ ldr r0, [r2]\n\
+ movs r1, 0x80\n\
+ lsls r1, 6\n\
+ orrs r0, r1\n\
+ str r0, [r2]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_080192B4: .4byte gBattleMoveFlags\n\
+_080192B8: .4byte gBattleMons\n\
+_080192BC: .4byte gBankAttacker\n\
+_080192C0: .4byte gProtectStructs\n\
+_080192C4: .4byte gBattleMoves\n\
+_080192C8: .4byte gSpecialStatuses\n\
+_080192CC: .4byte gBankTarget\n\
+_080192D0: .4byte gBattleCommunication\n\
+_080192D4: .4byte gBattlescriptCurrInstr\n\
+_080192D8: .4byte BattleScript_ApplySecondaryEffect\n\
+_080192DC: .4byte gHitMarker\n\
+_080192E0:\n\
+ ldr r0, _08019420 @ =gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x29\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080192F0\n\
+ bl _08019F76\n\
+_080192F0:\n\
+ ldr r5, _08019424 @ =gBattleMons\n\
+ ldr r7, _08019428 @ =gBankAttacker\n\
+ ldrb r1, [r7]\n\
+ movs r6, 0x58\n\
+ adds r0, r1, 0\n\
+ muls r0, r6\n\
+ adds r0, r5\n\
+ ldrh r0, [r0, 0x28]\n\
+ cmp r0, 0\n\
+ bne _08019308\n\
+ bl _08019F76\n\
+_08019308:\n\
+ ldr r0, _0801942C @ =gProtectStructs\n\
+ lsls r1, 4\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x1]\n\
+ lsls r0, 31\n\
+ cmp r0, 0\n\
+ beq _0801931A\n\
+ bl _08019F76\n\
+_0801931A:\n\
+ ldr r1, _08019430 @ =gBattleMoves\n\
+ lsls r0, r3, 1\n\
+ adds r0, r3\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r1, [r0, 0x8]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08019332\n\
+ bl _08019F76\n\
+_08019332:\n\
+ ldr r3, _08019434 @ =gSpecialStatuses\n\
+ ldr r0, _08019438 @ =gBankTarget\n\
+ mov r8, r0\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r2, r0, 2\n\
+ adds r0, r3, 0\n\
+ adds r0, 0x8\n\
+ adds r0, r2, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _0801935C\n\
+ adds r0, r3, 0\n\
+ adds r0, 0xC\n\
+ adds r0, r2, r0\n\
+ ldr r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _0801935C\n\
+ bl _08019F76\n\
+_0801935C:\n\
+ adds r0, r1, 0\n\
+ muls r0, r6\n\
+ adds r0, r5\n\
+ ldrh r0, [r0, 0x28]\n\
+ cmp r0, 0\n\
+ bne _0801936C\n\
+ bl _08019F76\n\
+_0801936C:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x3\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ beq _08019384\n\
+ bl _08019F76\n\
+_08019384:\n\
+ ldrb r0, [r7]\n\
+ muls r0, r6\n\
+ adds r0, r5\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0xC\n\
+ bne _08019396\n\
+ bl _08019F76\n\
+_08019396:\n\
+ ldr r0, [sp, 0x8]\n\
+ ldr r1, [sp, 0x10]\n\
+ bl GetGenderFromSpeciesAndPersonality\n\
+ adds r4, r0, 0\n\
+ ldr r0, [sp, 0xC]\n\
+ ldr r1, [sp, 0x14]\n\
+ bl GetGenderFromSpeciesAndPersonality\n\
+ lsls r4, 24\n\
+ lsls r0, 24\n\
+ cmp r4, r0\n\
+ bne _080193B4\n\
+ bl _08019F76\n\
+_080193B4:\n\
+ ldrb r0, [r7]\n\
+ muls r0, r6\n\
+ adds r4, r5, 0\n\
+ adds r4, 0x50\n\
+ adds r0, r4\n\
+ ldr r0, [r0]\n\
+ movs r1, 0xF0\n\
+ lsls r1, 12\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080193CE\n\
+ bl _08019F76\n\
+_080193CE:\n\
+ ldr r0, [sp, 0x8]\n\
+ ldr r1, [sp, 0x10]\n\
+ bl GetGenderFromSpeciesAndPersonality\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0xFF\n\
+ bne _080193E2\n\
+ bl _08019F76\n\
+_080193E2:\n\
+ ldr r0, [sp, 0xC]\n\
+ ldr r1, [sp, 0x14]\n\
+ bl GetGenderFromSpeciesAndPersonality\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0xFF\n\
+ bne _080193F6\n\
+ bl _08019F76\n\
+_080193F6:\n\
+ ldrb r0, [r7]\n\
+ adds r2, r0, 0\n\
+ muls r2, r6\n\
+ adds r2, r4\n\
+ ldr r1, _0801943C @ =gBitTable\n\
+ mov r3, r8\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldr r1, [r0]\n\
+ lsls r1, 16\n\
+ ldr r0, [r2]\n\
+ orrs r0, r1\n\
+ str r0, [r2]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _08019440 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08019444 @ =BattleScript_CuteCharmActivates\n\
+ str r0, [r1]\n\
+ bl _08019F22\n\
+ .align 2, 0\n\
+_08019420: .4byte gBattleMoveFlags\n\
+_08019424: .4byte gBattleMons\n\
+_08019428: .4byte gBankAttacker\n\
+_0801942C: .4byte gProtectStructs\n\
+_08019430: .4byte gBattleMoves\n\
+_08019434: .4byte gSpecialStatuses\n\
+_08019438: .4byte gBankTarget\n\
+_0801943C: .4byte gBitTable\n\
+_08019440: .4byte gBattlescriptCurrInstr\n\
+_08019444: .4byte BattleScript_CuteCharmActivates\n\
+_08019448:\n\
+ movs r5, 0\n\
+ mov r10, r5\n\
+ ldr r0, _0801947C @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r10, r0\n\
+ bcc _08019458\n\
+ bl _08019F76\n\
+_08019458:\n\
+ ldr r1, _08019480 @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r2, r10\n\
+ muls r2, r0\n\
+ adds r0, r2, 0\n\
+ adds r0, r1\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ subs r0, 0x7\n\
+ adds r2, r1, 0\n\
+ cmp r0, 0x41\n\
+ bls _08019472\n\
+ b _080196D6\n\
+_08019472:\n\
+ lsls r0, 2\n\
+ ldr r1, _08019484 @ =_08019488\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_0801947C: .4byte gNoOfAllBanks\n\
+_08019480: .4byte gBattleMons\n\
+_08019484: .4byte _08019488\n\
+ .align 2, 0\n\
+_08019488:\n\
+ .4byte _080195EC\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196B0\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _08019614\n\
+ .4byte _080196D6\n\
+ .4byte _08019590\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080195BC\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _08019680\n\
+ .4byte _08019650\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _080196D6\n\
+ .4byte _08019614\n\
+_08019590:\n\
+ movs r0, 0x58\n\
+ mov r3, r10\n\
+ muls r3, r0\n\
+ adds r0, r3, 0\n\
+ adds r1, r2, 0\n\
+ adds r1, 0x4C\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ ldr r1, _080195B0 @ =0x00000f88\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080195AA\n\
+ b _080196D6\n\
+_080195AA:\n\
+ ldr r0, _080195B4 @ =gBattleTextBuff1\n\
+ ldr r1, _080195B8 @ =gStatusConditionString_PoisonJpn\n\
+ b _0801969C\n\
+ .align 2, 0\n\
+_080195B0: .4byte 0x00000f88\n\
+_080195B4: .4byte gBattleTextBuff1\n\
+_080195B8: .4byte gStatusConditionString_PoisonJpn\n\
+_080195BC:\n\
+ movs r0, 0x58\n\
+ mov r1, r10\n\
+ muls r1, r0\n\
+ adds r0, r1, 0\n\
+ adds r1, r2, 0\n\
+ adds r1, 0x50\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080195D6\n\
+ b _080196D6\n\
+_080195D6:\n\
+ ldr r0, _080195E4 @ =gBattleTextBuff1\n\
+ ldr r1, _080195E8 @ =gStatusConditionString_ConfusionJpn\n\
+ bl StringCopy\n\
+ movs r2, 0x2\n\
+ mov r9, r2\n\
+ b _080196DC\n\
+ .align 2, 0\n\
+_080195E4: .4byte gBattleTextBuff1\n\
+_080195E8: .4byte gStatusConditionString_ConfusionJpn\n\
+_080195EC:\n\
+ movs r0, 0x58\n\
+ mov r3, r10\n\
+ muls r3, r0\n\
+ adds r0, r3, 0\n\
+ adds r1, r2, 0\n\
+ adds r1, 0x4C\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080196D6\n\
+ ldr r0, _0801960C @ =gBattleTextBuff1\n\
+ ldr r1, _08019610 @ =gStatusConditionString_ParalysisJpn\n\
+ b _0801969C\n\
+ .align 2, 0\n\
+_0801960C: .4byte gBattleTextBuff1\n\
+_08019610: .4byte gStatusConditionString_ParalysisJpn\n\
+_08019614:\n\
+ movs r0, 0x58\n\
+ mov r3, r10\n\
+ muls r3, r0\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x4C\n\
+ adds r0, r3, r0\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080196D6\n\
+ adds r2, 0x50\n\
+ adds r2, r3, r2\n\
+ ldr r0, [r2]\n\
+ ldr r1, _08019644 @ =0xf7ffffff\n\
+ ands r0, r1\n\
+ str r0, [r2]\n\
+ ldr r0, _08019648 @ =gBattleTextBuff1\n\
+ ldr r1, _0801964C @ =gStatusConditionString_SleepJpn\n\
+ bl StringCopy\n\
+ movs r0, 0x1\n\
+ mov r9, r0\n\
+ b _080196DC\n\
+ .align 2, 0\n\
+_08019644: .4byte 0xf7ffffff\n\
+_08019648: .4byte gBattleTextBuff1\n\
+_0801964C: .4byte gStatusConditionString_SleepJpn\n\
+_08019650:\n\
+ movs r0, 0x58\n\
+ mov r1, r10\n\
+ muls r1, r0\n\
+ adds r0, r1, 0\n\
+ adds r1, r2, 0\n\
+ adds r1, 0x4C\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080196D6\n\
+ ldr r0, _08019678 @ =gBattleTextBuff1\n\
+ ldr r1, _0801967C @ =gStatusConditionString_BurnJpn\n\
+ bl StringCopy\n\
+ movs r2, 0x1\n\
+ mov r9, r2\n\
+ b _080196DC\n\
+ .align 2, 0\n\
+_08019678: .4byte gBattleTextBuff1\n\
+_0801967C: .4byte gStatusConditionString_BurnJpn\n\
+_08019680:\n\
+ movs r0, 0x58\n\
+ mov r3, r10\n\
+ muls r3, r0\n\
+ adds r0, r3, 0\n\
+ adds r1, r2, 0\n\
+ adds r1, 0x4C\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x20\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080196D6\n\
+ ldr r0, _080196A8 @ =gBattleTextBuff1\n\
+ ldr r1, _080196AC @ =gStatusConditionString_IceJpn\n\
+_0801969C:\n\
+ bl StringCopy\n\
+ movs r5, 0x1\n\
+ mov r9, r5\n\
+ b _080196DC\n\
+ .align 2, 0\n\
+_080196A8: .4byte gBattleTextBuff1\n\
+_080196AC: .4byte gStatusConditionString_IceJpn\n\
+_080196B0:\n\
+ movs r0, 0x58\n\
+ mov r1, r10\n\
+ muls r1, r0\n\
+ adds r0, r1, 0\n\
+ adds r1, r2, 0\n\
+ adds r1, 0x50\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0xF0\n\
+ lsls r1, 12\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080196D6\n\
+ ldr r0, _080196EC @ =gBattleTextBuff1\n\
+ ldr r1, _080196F0 @ =gStatusConditionString_LoveJpn\n\
+ bl StringCopy\n\
+ movs r2, 0x3\n\
+ mov r9, r2\n\
+_080196D6:\n\
+ mov r3, r9\n\
+ cmp r3, 0\n\
+ beq _08019798\n\
+_080196DC:\n\
+ mov r5, r9\n\
+ cmp r5, 0x2\n\
+ beq _08019710\n\
+ cmp r5, 0x2\n\
+ bgt _080196F4\n\
+ cmp r5, 0x1\n\
+ beq _080196FC\n\
+ b _0801973C\n\
+ .align 2, 0\n\
+_080196EC: .4byte gBattleTextBuff1\n\
+_080196F0: .4byte gStatusConditionString_LoveJpn\n\
+_080196F4:\n\
+ mov r0, r9\n\
+ cmp r0, 0x3\n\
+ beq _08019728\n\
+ b _0801973C\n\
+_080196FC:\n\
+ ldr r1, _0801970C @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r2, r10\n\
+ muls r2, r0\n\
+ adds r1, 0x4C\n\
+ adds r2, r1\n\
+ movs r0, 0\n\
+ b _0801973A\n\
+ .align 2, 0\n\
+_0801970C: .4byte gBattleMons\n\
+_08019710:\n\
+ ldr r1, _08019724 @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r2, r10\n\
+ muls r2, r0\n\
+ adds r1, 0x50\n\
+ adds r2, r1\n\
+ ldr r0, [r2]\n\
+ movs r1, 0x8\n\
+ negs r1, r1\n\
+ b _08019738\n\
+ .align 2, 0\n\
+_08019724: .4byte gBattleMons\n\
+_08019728:\n\
+ ldr r1, _08019778 @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ mov r2, r10\n\
+ muls r2, r0\n\
+ adds r1, 0x50\n\
+ adds r2, r1\n\
+ ldr r0, [r2]\n\
+ ldr r1, _0801977C @ =0xfff0ffff\n\
+_08019738:\n\
+ ands r0, r1\n\
+_0801973A:\n\
+ str r0, [r2]\n\
+_0801973C:\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _08019780 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08019784 @ =gUnknown_081D9956\n\
+ str r0, [r1]\n\
+ ldr r0, _08019788 @ =0x02000000\n\
+ ldr r1, _0801978C @ =0x00016003\n\
+ adds r0, r1\n\
+ mov r2, r10\n\
+ strb r2, [r0]\n\
+ ldr r4, _08019790 @ =gActiveBank\n\
+ strb r2, [r4]\n\
+ ldrb r1, [r4]\n\
+ movs r0, 0x58\n\
+ muls r0, r1\n\
+ ldr r1, _08019794 @ =gUnknown_02024ACC\n\
+ adds r0, r1\n\
+ str r0, [sp]\n\
+ movs r0, 0\n\
+ movs r1, 0x28\n\
+ movs r2, 0\n\
+ movs r3, 0x4\n\
+ bl EmitSetAttributes\n\
+ ldrb r0, [r4]\n\
+ bl MarkBufferBankForExecution\n\
+ bl _08019F92\n\
+ .align 2, 0\n\
+_08019778: .4byte gBattleMons\n\
+_0801977C: .4byte 0xfff0ffff\n\
+_08019780: .4byte gBattlescriptCurrInstr\n\
+_08019784: .4byte gUnknown_081D9956\n\
+_08019788: .4byte 0x02000000\n\
+_0801978C: .4byte 0x00016003\n\
+_08019790: .4byte gActiveBank\n\
+_08019794: .4byte gUnknown_02024ACC\n\
+_08019798:\n\
+ mov r0, r10\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ ldr r0, _080197B0 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r10, r0\n\
+ bcs _080197AC\n\
+ b _08019458\n\
+_080197AC:\n\
+ bl _08019F76\n\
+ .align 2, 0\n\
+_080197B0: .4byte gNoOfAllBanks\n\
+_080197B4:\n\
+ movs r3, 0\n\
+ mov r10, r3\n\
+ ldr r0, _080197FC @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r10, r0\n\
+ bcc _080197C2\n\
+ b _08019F76\n\
+_080197C2:\n\
+ ldr r4, _08019800 @ =gBattleMons\n\
+_080197C4:\n\
+ movs r0, 0x58\n\
+ mov r5, r10\n\
+ muls r5, r0\n\
+ adds r0, r5, 0\n\
+ adds r0, r4\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x3B\n\
+ bne _080197E8\n\
+ mov r0, r10\n\
+ bl CastformDataTypeChange\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+ cmp r0, 0\n\
+ beq _080197E8\n\
+ b _08019E40\n\
+_080197E8:\n\
+ mov r0, r10\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ ldr r0, _080197FC @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r10, r0\n\
+ bcc _080197C4\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_080197FC: .4byte gNoOfAllBanks\n\
+_08019800: .4byte gBattleMons\n\
+_08019804:\n\
+ mov r1, r8\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x1C\n\
+ beq _0801980E\n\
+ b _08019F76\n\
+_0801980E:\n\
+ ldr r4, _08019860 @ =gHitMarker\n\
+ ldr r1, [r4]\n\
+ movs r0, 0x80\n\
+ lsls r0, 7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0801981E\n\
+ b _08019F76\n\
+_0801981E:\n\
+ ldr r0, _08019864 @ =0xffffbfff\n\
+ ands r1, r0\n\
+ str r1, [r4]\n\
+ ldr r3, _08019868 @ =0x000160ca\n\
+ adds r2, r7, r3\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x3F\n\
+ ands r0, r1\n\
+ strb r0, [r2]\n\
+ cmp r0, 0x6\n\
+ bne _08019838\n\
+ movs r0, 0x2\n\
+ strb r0, [r2]\n\
+_08019838:\n\
+ ldr r1, _0801986C @ =gBattleCommunication\n\
+ ldrb r0, [r2]\n\
+ adds r0, 0x40\n\
+ strb r0, [r1, 0x3]\n\
+ ldr r0, _08019870 @ =gBankTarget\n\
+ ldrb r1, [r0]\n\
+ ldr r5, _08019874 @ =0x00016003\n\
+ adds r0, r7, r5\n\
+ strb r1, [r0]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _08019878 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _0801987C @ =BattleScript_SynchronizeActivates\n\
+ str r0, [r1]\n\
+ ldr r0, [r4]\n\
+ movs r1, 0x80\n\
+ lsls r1, 6\n\
+ orrs r0, r1\n\
+ str r0, [r4]\n\
+ b _08019F22\n\
+ .align 2, 0\n\
+_08019860: .4byte gHitMarker\n\
+_08019864: .4byte 0xffffbfff\n\
+_08019868: .4byte 0x000160ca\n\
+_0801986C: .4byte gBattleCommunication\n\
+_08019870: .4byte gBankTarget\n\
+_08019874: .4byte 0x00016003\n\
+_08019878: .4byte gBattlescriptCurrInstr\n\
+_0801987C: .4byte BattleScript_SynchronizeActivates\n\
+_08019880:\n\
+ mov r1, r8\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x1C\n\
+ beq _0801988A\n\
+ b _08019F76\n\
+_0801988A:\n\
+ ldr r4, _080198DC @ =gHitMarker\n\
+ ldr r1, [r4]\n\
+ movs r0, 0x80\n\
+ lsls r0, 7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0801989A\n\
+ b _08019F76\n\
+_0801989A:\n\
+ ldr r0, _080198E0 @ =0xffffbfff\n\
+ ands r1, r0\n\
+ str r1, [r4]\n\
+ ldr r3, _080198E4 @ =0x000160ca\n\
+ adds r2, r7, r3\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x3F\n\
+ ands r0, r1\n\
+ strb r0, [r2]\n\
+ cmp r0, 0x6\n\
+ bne _080198B4\n\
+ movs r0, 0x2\n\
+ strb r0, [r2]\n\
+_080198B4:\n\
+ ldr r1, _080198E8 @ =gBattleCommunication\n\
+ ldrb r0, [r2]\n\
+ strb r0, [r1, 0x3]\n\
+ ldr r0, _080198EC @ =gBankAttacker\n\
+ ldrb r1, [r0]\n\
+ ldr r5, _080198F0 @ =0x00016003\n\
+ adds r0, r7, r5\n\
+ strb r1, [r0]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _080198F4 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _080198F8 @ =BattleScript_SynchronizeActivates\n\
+ str r0, [r1]\n\
+ ldr r0, [r4]\n\
+ movs r1, 0x80\n\
+ lsls r1, 6\n\
+ orrs r0, r1\n\
+ str r0, [r4]\n\
+ b _08019F22\n\
+ .align 2, 0\n\
+_080198DC: .4byte gHitMarker\n\
+_080198E0: .4byte 0xffffbfff\n\
+_080198E4: .4byte 0x000160ca\n\
+_080198E8: .4byte gBattleCommunication\n\
+_080198EC: .4byte gBankAttacker\n\
+_080198F0: .4byte 0x00016003\n\
+_080198F4: .4byte gBattlescriptCurrInstr\n\
+_080198F8: .4byte BattleScript_SynchronizeActivates\n\
+_080198FC:\n\
+ movs r4, 0\n\
+ ldr r0, _08019934 @ =gNoOfAllBanks\n\
+ ldrb r1, [r0]\n\
+ cmp r4, r1\n\
+ blt _08019908\n\
+ b _08019F76\n\
+_08019908:\n\
+ ldr r0, _08019938 @ =gBattleMons\n\
+ adds r5, r1, 0\n\
+ ldr r2, _0801993C @ =gStatuses3\n\
+ adds r3, r0, 0\n\
+ adds r3, 0x20\n\
+ movs r6, 0x80\n\
+ lsls r6, 12\n\
+_08019916:\n\
+ ldrb r1, [r3]\n\
+ cmp r1, 0x16\n\
+ bne _08019926\n\
+ ldr r0, [r2]\n\
+ ands r0, r6\n\
+ cmp r0, 0\n\
+ beq _08019926\n\
+ b _08019E6C\n\
+_08019926:\n\
+ adds r2, 0x4\n\
+ adds r3, 0x58\n\
+ adds r4, 0x1\n\
+ cmp r4, r5\n\
+ blt _08019916\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019934: .4byte gNoOfAllBanks\n\
+_08019938: .4byte gBattleMons\n\
+_0801993C: .4byte gStatuses3\n\
+_08019940:\n\
+ movs r4, 0\n\
+ ldr r0, _08019A1C @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _0801994C\n\
+ b _08019F76\n\
+_0801994C:\n\
+ ldr r0, _08019A20 @ =gActiveBank\n\
+ mov r8, r0\n\
+ ldr r1, _08019A24 @ =gBattleMons\n\
+ adds r1, 0x20\n\
+ str r1, [sp, 0x1C]\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x20]\n\
+_0801995A:\n\
+ ldr r3, [sp, 0x1C]\n\
+ ldrb r0, [r3]\n\
+ cmp r0, 0x24\n\
+ beq _08019964\n\
+ b _08019AF6\n\
+_08019964:\n\
+ ldr r0, _08019A28 @ =gStatuses3\n\
+ ldr r5, [sp, 0x20]\n\
+ adds r0, r5, r0\n\
+ ldr r1, [r0]\n\
+ movs r0, 0x80\n\
+ lsls r0, 13\n\
+ ands r1, r0\n\
+ str r5, [sp, 0x18]\n\
+ cmp r1, 0\n\
+ bne _0801997A\n\
+ b _08019AF6\n\
+_0801997A:\n\
+ lsls r0, r4, 24\n\
+ lsrs r0, 24\n\
+ bl GetBankIdentity\n\
+ movs r1, 0x1\n\
+ adds r5, r0, 0\n\
+ eors r5, r1\n\
+ ands r5, r1\n\
+ adds r0, r5, 0\n\
+ bl GetBankByPlayerAI\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r0, r5, 0x2\n\
+ bl GetBankByPlayerAI\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ ldr r0, _08019A2C @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r2, 0x1\n\
+ adds r0, r2, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080199AE\n\
+ b _08019ABC\n\
+_080199AE:\n\
+ movs r1, 0x58\n\
+ adds r0, r6, 0\n\
+ muls r0, r1\n\
+ ldr r3, _08019A24 @ =gBattleMons\n\
+ adds r1, r0, r3\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _08019A78\n\
+ ldrh r0, [r1, 0x28]\n\
+ cmp r0, 0\n\
+ beq _08019A34\n\
+ movs r1, 0x58\n\
+ adds r0, r7, 0\n\
+ muls r0, r1\n\
+ adds r1, r0, r3\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _08019A34\n\
+ ldrh r0, [r1, 0x28]\n\
+ cmp r0, 0\n\
+ beq _08019A34\n\
+ str r2, [sp, 0x24]\n\
+ bl Random\n\
+ ldr r2, [sp, 0x24]\n\
+ adds r1, r2, 0\n\
+ ands r1, r0\n\
+ lsls r1, 1\n\
+ orrs r5, r1\n\
+ adds r0, r5, 0\n\
+ bl GetBankByPlayerAI\n\
+ mov r2, r8\n\
+ strb r0, [r2]\n\
+ ldrb r0, [r2]\n\
+ movs r3, 0x58\n\
+ muls r0, r3\n\
+ ldr r5, _08019A24 @ =gBattleMons\n\
+ adds r0, r5\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ ldr r1, [sp, 0x1C]\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r2]\n\
+ muls r0, r3\n\
+ adds r0, r5\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ ldr r2, _08019A30 @ =gLastUsedAbility\n\
+ strb r0, [r2]\n\
+ b _08019AE4\n\
+ .align 2, 0\n\
+_08019A1C: .4byte gNoOfAllBanks\n\
+_08019A20: .4byte gActiveBank\n\
+_08019A24: .4byte gBattleMons\n\
+_08019A28: .4byte gStatuses3\n\
+_08019A2C: .4byte gBattleTypeFlags\n\
+_08019A30: .4byte gLastUsedAbility\n\
+_08019A34:\n\
+ ldr r3, _08019A74 @ =gBattleMons\n\
+ movs r2, 0x58\n\
+ adds r0, r6, 0\n\
+ muls r0, r2\n\
+ adds r1, r0, r3\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _08019A78\n\
+ ldrh r0, [r1, 0x28]\n\
+ cmp r0, 0\n\
+ beq _08019A78\n\
+ mov r5, r8\n\
+ strb r6, [r5]\n\
+ adds r1, r4, 0\n\
+ muls r1, r2\n\
+ adds r1, r3\n\
+ ldrb r0, [r5]\n\
+ muls r0, r2\n\
+ adds r0, r3\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ adds r1, 0x20\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r5]\n\
+ muls r0, r2\n\
+ adds r0, r3\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ b _08019AE0\n\
+ .align 2, 0\n\
+_08019A74: .4byte gBattleMons\n\
+_08019A78:\n\
+ ldr r3, _08019AB8 @ =gBattleMons\n\
+ movs r2, 0x58\n\
+ adds r0, r7, 0\n\
+ muls r0, r2\n\
+ adds r1, r0, r3\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _08019AEE\n\
+ ldrh r0, [r1, 0x28]\n\
+ cmp r0, 0\n\
+ beq _08019AEE\n\
+ mov r5, r8\n\
+ strb r7, [r5]\n\
+ adds r1, r4, 0\n\
+ muls r1, r2\n\
+ adds r1, r3\n\
+ ldrb r0, [r5]\n\
+ muls r0, r2\n\
+ adds r0, r3\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ adds r1, 0x20\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r5]\n\
+ muls r0, r2\n\
+ adds r0, r3\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ b _08019AE0\n\
+ .align 2, 0\n\
+_08019AB8: .4byte gBattleMons\n\
+_08019ABC:\n\
+ mov r2, r8\n\
+ strb r6, [r2]\n\
+ movs r3, 0x58\n\
+ adds r0, r6, 0\n\
+ muls r0, r3\n\
+ ldr r5, _08019B10 @ =gBattleMons\n\
+ adds r0, r5\n\
+ adds r2, r0, 0\n\
+ adds r2, 0x20\n\
+ ldrb r1, [r2]\n\
+ cmp r1, 0\n\
+ beq _08019AEE\n\
+ ldrh r0, [r0, 0x28]\n\
+ cmp r0, 0\n\
+ beq _08019AEE\n\
+ ldr r0, [sp, 0x1C]\n\
+ strb r1, [r0]\n\
+ ldrb r0, [r2]\n\
+_08019AE0:\n\
+ ldr r1, _08019B14 @ =gLastUsedAbility\n\
+ strb r0, [r1]\n\
+_08019AE4:\n\
+ mov r0, r9\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019AEE:\n\
+ mov r2, r9\n\
+ cmp r2, 0\n\
+ beq _08019AF6\n\
+ b _08019E88\n\
+_08019AF6:\n\
+ ldr r3, [sp, 0x1C]\n\
+ adds r3, 0x58\n\
+ str r3, [sp, 0x1C]\n\
+ ldr r5, [sp, 0x20]\n\
+ adds r5, 0x4\n\
+ str r5, [sp, 0x20]\n\
+ adds r4, 0x1\n\
+ ldr r0, _08019B18 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ bge _08019B0E\n\
+ b _0801995A\n\
+_08019B0E:\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019B10: .4byte gBattleMons\n\
+_08019B14: .4byte gLastUsedAbility\n\
+_08019B18: .4byte gNoOfAllBanks\n\
+_08019B1C:\n\
+ movs r4, 0\n\
+ ldr r0, _08019B54 @ =gNoOfAllBanks\n\
+ ldrb r1, [r0]\n\
+ cmp r4, r1\n\
+ blt _08019B28\n\
+ b _08019F76\n\
+_08019B28:\n\
+ ldr r0, _08019B58 @ =gBattleMons\n\
+ adds r5, r1, 0\n\
+ ldr r2, _08019B5C @ =gStatuses3\n\
+ adds r3, r0, 0\n\
+ adds r3, 0x20\n\
+ movs r6, 0x80\n\
+ lsls r6, 12\n\
+_08019B36:\n\
+ ldrb r1, [r3]\n\
+ cmp r1, 0x16\n\
+ bne _08019B46\n\
+ ldr r0, [r2]\n\
+ ands r0, r6\n\
+ cmp r0, 0\n\
+ beq _08019B46\n\
+ b _08019F04\n\
+_08019B46:\n\
+ adds r2, 0x4\n\
+ adds r3, 0x58\n\
+ adds r4, 0x1\n\
+ cmp r4, r5\n\
+ blt _08019B36\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019B54: .4byte gNoOfAllBanks\n\
+_08019B58: .4byte gBattleMons\n\
+_08019B5C: .4byte gStatuses3\n\
+_08019B60:\n\
+ mov r0, r10\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r4, 0\n\
+ ldr r0, _08019BB0 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019B76\n\
+ b _08019F76\n\
+_08019B76:\n\
+ ldr r7, _08019BB4 @ =gBattleMons\n\
+_08019B78:\n\
+ lsls r0, r4, 24\n\
+ lsrs r0, 24\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r3, r4, 0x1\n\
+ cmp r0, r5\n\
+ beq _08019BA2\n\
+ movs r0, 0x58\n\
+ muls r0, r4\n\
+ adds r0, r7\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, r6\n\
+ bne _08019BA2\n\
+ ldr r0, _08019BB8 @ =gLastUsedAbility\n\
+ strb r6, [r0]\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019BA2:\n\
+ adds r4, r3, 0\n\
+ ldr r0, _08019BB0 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019B78\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019BB0: .4byte gNoOfAllBanks\n\
+_08019BB4: .4byte gBattleMons\n\
+_08019BB8: .4byte gLastUsedAbility\n\
+_08019BBC:\n\
+ mov r0, r10\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r4, 0\n\
+ ldr r0, _08019C0C @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019BD2\n\
+ b _08019F76\n\
+_08019BD2:\n\
+ ldr r7, _08019C10 @ =gBattleMons\n\
+_08019BD4:\n\
+ lsls r0, r4, 24\n\
+ lsrs r0, 24\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r3, r4, 0x1\n\
+ cmp r0, r5\n\
+ bne _08019BFE\n\
+ movs r0, 0x58\n\
+ muls r0, r4\n\
+ adds r0, r7\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, r6\n\
+ bne _08019BFE\n\
+ ldr r0, _08019C14 @ =gLastUsedAbility\n\
+ strb r6, [r0]\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019BFE:\n\
+ adds r4, r3, 0\n\
+ ldr r0, _08019C0C @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019BD4\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019C0C: .4byte gNoOfAllBanks\n\
+_08019C10: .4byte gBattleMons\n\
+_08019C14: .4byte gLastUsedAbility\n\
+_08019C18:\n\
+ mov r1, r8\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0xFD\n\
+ beq _08019C40\n\
+ cmp r0, 0xFE\n\
+ beq _08019C78\n\
+ movs r4, 0\n\
+ ldr r0, _08019C38 @ =gNoOfAllBanks\n\
+ adds r5, r0, 0\n\
+ ldrb r2, [r5]\n\
+ cmp r4, r2\n\
+ blt _08019C32\n\
+ b _08019F76\n\
+_08019C32:\n\
+ ldr r2, _08019C3C @ =gBattleMons\n\
+ b _08019CB0\n\
+ .align 2, 0\n\
+_08019C38: .4byte gNoOfAllBanks\n\
+_08019C3C: .4byte gBattleMons\n\
+_08019C40:\n\
+ movs r4, 0\n\
+ ldr r0, _08019C70 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019C4C\n\
+ b _08019F76\n\
+_08019C4C:\n\
+ ldr r5, _08019C74 @ =gStatuses3\n\
+ movs r2, 0x80\n\
+ lsls r2, 9\n\
+ adds r1, r0, 0\n\
+_08019C54:\n\
+ lsls r0, r4, 2\n\
+ adds r0, r5\n\
+ ldr r0, [r0]\n\
+ ands r0, r2\n\
+ adds r3, r4, 0x1\n\
+ cmp r0, 0\n\
+ beq _08019C68\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019C68:\n\
+ adds r4, r3, 0\n\
+ cmp r4, r1\n\
+ blt _08019C54\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019C70: .4byte gNoOfAllBanks\n\
+_08019C74: .4byte gStatuses3\n\
+_08019C78:\n\
+ movs r4, 0\n\
+ ldr r0, _08019CA8 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019C84\n\
+ b _08019F76\n\
+_08019C84:\n\
+ ldr r5, _08019CAC @ =gStatuses3\n\
+ movs r2, 0x80\n\
+ lsls r2, 10\n\
+ adds r1, r0, 0\n\
+_08019C8C:\n\
+ lsls r0, r4, 2\n\
+ adds r0, r5\n\
+ ldr r0, [r0]\n\
+ ands r0, r2\n\
+ adds r3, r4, 0x1\n\
+ cmp r0, 0\n\
+ beq _08019CA0\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019CA0:\n\
+ adds r4, r3, 0\n\
+ cmp r4, r1\n\
+ blt _08019C8C\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019CA8: .4byte gNoOfAllBanks\n\
+_08019CAC: .4byte gStatuses3\n\
+_08019CB0:\n\
+ movs r0, 0x58\n\
+ muls r0, r4\n\
+ adds r0, r2\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ adds r3, r4, 0x1\n\
+ cmp r0, r6\n\
+ bne _08019CCA\n\
+ mov r0, r8\n\
+ strb r6, [r0]\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019CCA:\n\
+ adds r4, r3, 0\n\
+ ldrb r1, [r5]\n\
+ cmp r4, r1\n\
+ blt _08019CB0\n\
+ b _08019F76\n\
+_08019CD4:\n\
+ movs r4, 0\n\
+ ldr r0, _08019D10 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019CE0\n\
+ b _08019F76\n\
+_08019CE0:\n\
+ ldr r7, _08019D14 @ =gBattleMons\n\
+ adds r2, r0, 0\n\
+ movs r5, 0x58\n\
+_08019CE6:\n\
+ adds r0, r4, 0\n\
+ muls r0, r5\n\
+ adds r1, r0, r7\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ adds r3, r4, 0x1\n\
+ cmp r0, r6\n\
+ bne _08019D08\n\
+ ldrh r0, [r1, 0x28]\n\
+ cmp r0, 0\n\
+ beq _08019D08\n\
+ mov r0, r8\n\
+ strb r6, [r0]\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019D08:\n\
+ adds r4, r3, 0\n\
+ cmp r4, r2\n\
+ blt _08019CE6\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019D10: .4byte gNoOfAllBanks\n\
+_08019D14: .4byte gBattleMons\n\
+_08019D18:\n\
+ movs r4, 0\n\
+ ldr r0, _08019D50 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019D24\n\
+ b _08019F76\n\
+_08019D24:\n\
+ ldr r7, _08019D54 @ =gBattleMons\n\
+ adds r1, r0, 0\n\
+ movs r5, 0x58\n\
+ ldr r2, _08019D58 @ =gLastUsedAbility\n\
+_08019D2C:\n\
+ adds r0, r4, 0\n\
+ muls r0, r5\n\
+ adds r0, r7\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ adds r3, r4, 0x1\n\
+ cmp r0, r6\n\
+ bne _08019D48\n\
+ cmp r4, r10\n\
+ beq _08019D48\n\
+ strb r6, [r2]\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019D48:\n\
+ adds r4, r3, 0\n\
+ cmp r4, r1\n\
+ blt _08019D2C\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019D50: .4byte gNoOfAllBanks\n\
+_08019D54: .4byte gBattleMons\n\
+_08019D58: .4byte gLastUsedAbility\n\
+_08019D5C:\n\
+ mov r0, r10\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r4, 0\n\
+ ldr r0, _08019DAC @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019D72\n\
+ b _08019F76\n\
+_08019D72:\n\
+ ldr r7, _08019DB0 @ =gBattleMons\n\
+_08019D74:\n\
+ lsls r0, r4, 24\n\
+ lsrs r0, 24\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, r5\n\
+ beq _08019DA0\n\
+ movs r0, 0x58\n\
+ muls r0, r4\n\
+ adds r0, r7\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, r6\n\
+ bne _08019DA0\n\
+ ldr r0, _08019DB4 @ =gLastUsedAbility\n\
+ strb r6, [r0]\n\
+ mov r0, r9\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019DA0:\n\
+ adds r4, 0x1\n\
+ ldr r0, _08019DAC @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019D74\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019DAC: .4byte gNoOfAllBanks\n\
+_08019DB0: .4byte gBattleMons\n\
+_08019DB4: .4byte gLastUsedAbility\n\
+_08019DB8:\n\
+ mov r0, r10\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r4, 0\n\
+ ldr r0, _08019E08 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019DCE\n\
+ b _08019F76\n\
+_08019DCE:\n\
+ ldr r7, _08019E0C @ =gBattleMons\n\
+_08019DD0:\n\
+ lsls r0, r4, 24\n\
+ lsrs r0, 24\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, r5\n\
+ bne _08019DFC\n\
+ movs r0, 0x58\n\
+ muls r0, r4\n\
+ adds r0, r7\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, r6\n\
+ bne _08019DFC\n\
+ ldr r0, _08019E10 @ =gLastUsedAbility\n\
+ strb r6, [r0]\n\
+ mov r0, r9\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019DFC:\n\
+ adds r4, 0x1\n\
+ ldr r0, _08019E08 @ =gNoOfAllBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt _08019DD0\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019E08: .4byte gNoOfAllBanks\n\
+_08019E0C: .4byte gBattleMons\n\
+_08019E10: .4byte gLastUsedAbility\n\
+_08019E14:\n\
+ ldr r0, _08019E30 @ =BattleScript_CastformChange\n\
+ bl b_push_move_exec\n\
+ ldr r0, _08019E34 @ =0x02000000\n\
+ ldr r2, _08019E38 @ =0x00016003\n\
+ adds r1, r0, r2\n\
+ strb r6, [r1]\n\
+ mov r1, r9\n\
+ subs r1, 0x1\n\
+ ldr r3, _08019E3C @ =0x0001609b\n\
+ adds r0, r3\n\
+ strb r1, [r0]\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019E30: .4byte BattleScript_CastformChange\n\
+_08019E34: .4byte 0x02000000\n\
+_08019E38: .4byte 0x00016003\n\
+_08019E3C: .4byte 0x0001609b\n\
+_08019E40:\n\
+ ldr r0, _08019E5C @ =BattleScript_CastformChange\n\
+ bl b_push_move_exec\n\
+ ldr r0, _08019E60 @ =0x02000000\n\
+ ldr r5, _08019E64 @ =0x00016003\n\
+ adds r1, r0, r5\n\
+ mov r2, r10\n\
+ strb r2, [r1]\n\
+ mov r1, r9\n\
+ subs r1, 0x1\n\
+ ldr r3, _08019E68 @ =0x0001609b\n\
+ adds r0, r3\n\
+ strb r1, [r0]\n\
+ b _08019F92\n\
+ .align 2, 0\n\
+_08019E5C: .4byte BattleScript_CastformChange\n\
+_08019E60: .4byte 0x02000000\n\
+_08019E64: .4byte 0x00016003\n\
+_08019E68: .4byte 0x0001609b\n\
+_08019E6C:\n\
+ mov r5, r8\n\
+ strb r1, [r5]\n\
+ ldr r0, [r2]\n\
+ ldr r1, _08019E80 @ =0xfff7ffff\n\
+ ands r0, r1\n\
+ str r0, [r2]\n\
+ ldr r0, _08019E84 @ =gUnknown_081D978C\n\
+ bl b_push_move_exec\n\
+ b _08019F1A\n\
+ .align 2, 0\n\
+_08019E80: .4byte 0xfff7ffff\n\
+_08019E84: .4byte gUnknown_081D978C\n\
+_08019E88:\n\
+ ldr r0, _08019EDC @ =BattleScript_TraceActivates\n\
+ bl b_push_move_exec\n\
+ ldr r1, _08019EE0 @ =gStatuses3\n\
+ ldr r2, [sp, 0x18]\n\
+ adds r1, r2, r1\n\
+ ldr r0, [r1]\n\
+ ldr r2, _08019EE4 @ =0xffefffff\n\
+ ands r0, r2\n\
+ str r0, [r1]\n\
+ ldr r0, _08019EE8 @ =0x02000000\n\
+ ldr r3, _08019EEC @ =0x00016003\n\
+ adds r0, r3\n\
+ strb r4, [r0]\n\
+ ldr r1, _08019EF0 @ =gBattleTextBuff1\n\
+ movs r4, 0xFD\n\
+ strb r4, [r1]\n\
+ movs r0, 0x4\n\
+ strb r0, [r1, 0x1]\n\
+ ldr r2, _08019EF4 @ =gActiveBank\n\
+ ldrb r0, [r2]\n\
+ strb r0, [r1, 0x2]\n\
+ ldr r3, _08019EF8 @ =gBattlePartyID\n\
+ ldrb r0, [r2]\n\
+ lsls r0, 1\n\
+ adds r0, r3\n\
+ ldrh r0, [r0]\n\
+ strb r0, [r1, 0x3]\n\
+ movs r0, 0xFF\n\
+ strb r0, [r1, 0x4]\n\
+ ldr r1, _08019EFC @ =gBattleTextBuff2\n\
+ strb r4, [r1]\n\
+ movs r0, 0x9\n\
+ strb r0, [r1, 0x1]\n\
+ ldr r0, _08019F00 @ =gLastUsedAbility\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1, 0x2]\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ strb r0, [r1, 0x3]\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019EDC: .4byte BattleScript_TraceActivates\n\
+_08019EE0: .4byte gStatuses3\n\
+_08019EE4: .4byte 0xffefffff\n\
+_08019EE8: .4byte 0x02000000\n\
+_08019EEC: .4byte 0x00016003\n\
+_08019EF0: .4byte gBattleTextBuff1\n\
+_08019EF4: .4byte gActiveBank\n\
+_08019EF8: .4byte gBattlePartyID\n\
+_08019EFC: .4byte gBattleTextBuff2\n\
+_08019F00: .4byte gLastUsedAbility\n\
+_08019F04:\n\
+ mov r5, r8\n\
+ strb r1, [r5]\n\
+ ldr r0, [r2]\n\
+ ldr r1, _08019F30 @ =0xfff7ffff\n\
+ ands r0, r1\n\
+ str r0, [r2]\n\
+ bl b_movescr_stack_push_cursor\n\
+ ldr r1, _08019F34 @ =gBattlescriptCurrInstr\n\
+ ldr r0, _08019F38 @ =gUnknown_081D9795\n\
+ str r0, [r1]\n\
+_08019F1A:\n\
+ ldr r0, _08019F3C @ =0x02000000\n\
+ ldr r1, _08019F40 @ =0x000160dd\n\
+ adds r0, r1\n\
+ strb r4, [r0]\n\
+_08019F22:\n\
+ mov r0, r9\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+ b _08019F76\n\
+ .align 2, 0\n\
+_08019F30: .4byte 0xfff7ffff\n\
+_08019F34: .4byte gBattlescriptCurrInstr\n\
+_08019F38: .4byte gUnknown_081D9795\n\
+_08019F3C: .4byte 0x02000000\n\
+_08019F40: .4byte 0x000160dd\n\
+_08019F44:\n\
+ movs r4, 0\n\
+ ldr r0, _08019FA4 @ =gNoOfAllBanks\n\
+ ldrb r1, [r0]\n\
+ cmp r4, r1\n\
+ bge _08019F76\n\
+ ldr r0, _08019FA8 @ =gBattleMons\n\
+ adds r2, r1, 0\n\
+ adds r1, r0, 0\n\
+ adds r1, 0x20\n\
+ ldr r3, _08019FAC @ =gLastUsedAbility\n\
+_08019F58:\n\
+ ldrb r0, [r1]\n\
+ cmp r0, r6\n\
+ bne _08019F6E\n\
+ cmp r4, r10\n\
+ beq _08019F6E\n\
+ strb r6, [r3]\n\
+ mov r0, r9\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+_08019F6E:\n\
+ adds r1, 0x58\n\
+ adds r4, 0x1\n\
+ cmp r4, r2\n\
+ blt _08019F58\n\
+_08019F76:\n\
+ mov r2, r9\n\
+ cmp r2, 0\n\
+ beq _08019F92\n\
+_08019F7C:\n\
+ ldr r3, [sp, 0x4]\n\
+ cmp r3, 0xB\n\
+ bhi _08019F92\n\
+ ldr r1, _08019FAC @ =gLastUsedAbility\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0xFF\n\
+ beq _08019F92\n\
+ adds r1, r0, 0\n\
+ mov r0, r10\n\
+ bl RecordAbilityBattle\n\
+_08019F92:\n\
+ mov r0, r9\n\
+ add sp, 0x28\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_08019FA4: .4byte gNoOfAllBanks\n\
+_08019FA8: .4byte gBattleMons\n\
+_08019FAC: .4byte gLastUsedAbility\n\
+ .syntax divided");
+}
+
+#endif // NONMATCHING
+
+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;
+}
+
+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;
+}
+
+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(gUnknown_081D9A44);
+ 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(gUnknown_081D9A44);
+ 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 = gUnknown_081D9A4A;
+ 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 = gUnknown_081D9A4A;
+ 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])
+ {
+ gSideTimer[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4);
+ gSideTimer[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;
+ 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 (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp)
+ targetBank = gSideTimer[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 = GetBankByPlayerAI((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;
+ else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & 4)
+ {
+ if (GetBankSide(gBankAttacker) == 0)
+ {
+ if (Random() & 1)
+ targetBank = GetBankByPlayerAI(1);
+ else
+ targetBank = GetBankByPlayerAI(3);
+ }
+ else
+ {
+ if (Random() & 1)
+ targetBank = GetBankByPlayerAI(0);
+ else
+ targetBank = GetBankByPlayerAI(2);
+ }
+ if (gAbsentBankFlags & gBitTable[targetBank])
+ targetBank ^= 2;
+ }
+ else
+ targetBank = GetBankByPlayerAI((GetBankIdentity(gBankAttacker) & 1) ^ 1);
+ break;
+ case 2:
+ case 16:
+ targetBank = gBankAttacker;
+ break;
+ }
+ ewram[gBankAttacker + 0x16010] = 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(BADGE08_GET))
+ return 0;
+
+ obedienceLevel = 10;
+ if (FlagGet(BADGE02_GET))
+ obedienceLevel = 30;
+ if (FlagGet(BADGE04_GET))
+ obedienceLevel = 50;
+ if (FlagGet(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 = gUnknown_081D996F;
+ 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 = gUnknown_081D9989;
+ 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;
+ }
+ }
+}