Advertisement
Guest User

battle_4

a guest
Apr 15th, 2019
413
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 478.90 KB | None | 0 0
  1. #include "global.h"
  2. #include "battle.h"
  3. #include "battle_message.h"
  4. #include "battle_string_ids.h"
  5. #include "battle_script_commands.h"
  6. #include "battle_util.h"
  7. #include "constants/battle_move_effects.h"
  8. #include "constants/moves.h"
  9. #include "constants/abilities.h"
  10. #include "item.h"
  11. #include "constants/items.h"
  12. #include "data2.h"
  13. #include "constants/hold_effects.h"
  14. #include "random.h"
  15. #include "rom3.h"
  16. #include "constants/species.h"
  17. #include "pokemon.h"
  18. #include "text.h"
  19. #include "palette.h"
  20. #include "main.h"
  21. #include "constants/songs.h"
  22. #include "sound.h"
  23. #include "task.h"
  24. #include "decompress.h"
  25. #include "pokemon_summary_screen.h"
  26. #include "naming_screen.h"
  27. #include "ewram.h"
  28. #include "util.h"
  29.  
  30. // TODO: put this into battle_controllers.h
  31.  
  32. #define RET_VALUE_LEVELLED_UP   11
  33.  
  34. enum
  35. {
  36.     CONTROLLER_GETMONDATA,
  37.     CONTROLLER_GETRAWMONDATA,
  38.     CONTROLLER_SETMONDATA,
  39.     CONTROLLER_SETRAWMONDATA,
  40.     CONTROLLER_LOADMONSPRITE,
  41.     CONTROLLER_SWITCHINANIM,
  42.     CONTROLLER_RETURNMONTOBALL,
  43.     CONTROLLER_DRAWTRAINERPIC,
  44.     CONTROLLER_TRAINERSLIDE,
  45.     CONTROLLER_TRAINERSLIDEBACK,
  46.     CONTROLLER_FAINTANIMATION,
  47.     CONTROLLER_PALETTEFADE,
  48.     CONTROLLER_SUCCESSBALLTHROWANIM,
  49.     CONTROLLER_BALLTHROWANIM,
  50.     CONTROLLER_PAUSE,
  51.     CONTROLLER_MOVEANIMATION,
  52.     CONTROLLER_PRINTSTRING,
  53.     CONTROLLER_PRINTSTRINGPLAYERONLY,
  54.     CONTROLLER_CHOOSEACTION,
  55.     CONTROLLER_UNKNOWNYESNOBOX,
  56.     CONTROLLER_CHOOSEMOVE,
  57.     CONTROLLER_OPENBAG,
  58.     CONTROLLER_CHOOSEPOKEMON,
  59.     CONTROLLER_23,
  60.     CONTROLLER_HEALTHBARUPDATE,
  61.     CONTROLLER_EXPUPDATE,
  62.     CONTROLLER_STATUSICONUPDATE,
  63.     CONTROLLER_STATUSANIMATION,
  64.     CONTROLLER_STATUSXOR,
  65.     CONTROLLER_DATATRANSFER,
  66.     CONTROLLER_DMA3TRANSFER,
  67.     CONTROLLER_31,
  68.     CONTROLLER_32,
  69.     CONTROLLER_TWORETURNVALUES,
  70.     CONTROLLER_CHOSENMONRETURNVALUE,
  71.     CONTROLLER_ONERETURNVALUE,
  72.     CONTROLLER_ONERETURNVALUE_DUPLICATE,
  73.     CONTROLLER_37,
  74.     CONTROLLER_38,
  75.     CONTROLLER_39,
  76.     CONTROLLER_40,
  77.     CONTROLLER_HITANIMATION,
  78.     CONTROLLER_42,
  79.     CONTROLLER_EFFECTIVENESSSOUND,
  80.     CONTROLLER_PLAYFANFAREORBGM,
  81.     CONTROLLER_FAINTINGCRY,
  82.     CONTROLLER_INTROSLIDE,
  83.     CONTROLLER_INTROTRAINERBALLTHROW,
  84.     CONTROLLER_DRAWPARTYSTATUSSUMMARY,
  85.     CONTROLLER_49,
  86.     CONTROLLER_50,
  87.     CONTROLLER_SPRITEINVISIBILITY,
  88.     CONTROLLER_BATTLEANIMATION,
  89.     CONTROLLER_LINKSTANDBYMSG,
  90.     CONTROLLER_RESETACTIONMOVESELECTION,
  91.     CONTROLLER_55,
  92.     /*new controllers should go here*/
  93.     CONTROLLER_TERMINATOR_NOP,
  94.     CONTROLLER_CMDS_COUNT
  95. };
  96.  
  97. //extern needed variables
  98. extern u8 gUnknown_02023A14_50;
  99. extern u8 gCritMultiplier;
  100. extern s32 gBattleMoveDamage;
  101. extern u32 gStatuses3[MAX_BATTLERS_COUNT];
  102. extern u16 gBattleTypeFlags;
  103. extern const struct BaseStats gBaseStats[];
  104. extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT];
  105. extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT];
  106. extern u8 gActiveBattler;
  107. extern u32 gBattleExecBuffer;
  108. extern u8 gBattlersCount;
  109. extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT];
  110. extern u8 gBanksByTurnOrder[MAX_BATTLERS_COUNT];
  111. extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT];
  112. extern u16 gCurrentMove;
  113. extern u8 gLastUsedAbility;
  114. extern u16 gBattleWeather;
  115. extern u8 gStringBank;
  116. extern u8 gEffectBank;
  117. extern u8 gAbsentBattlerFlags;
  118. extern u8 gMultiHitCounter;
  119. extern u16 gLastUsedMove[4];
  120. extern u16 gLockedMoves[4];
  121. extern u16 gChosenMovesByBanks[4];
  122. extern u16 gSideAffecting[2];
  123. extern u16 gPauseCounterBattle;
  124. extern u16 gPaydayMoney;
  125. extern u16 gRandomTurnNumber;
  126. extern u8 gBattleOutcome;
  127. extern u8 gBattleTerrain;
  128. extern u16 gTrainerBattleOpponent;
  129. extern u8 gBankAttacker;
  130. extern u8 gBankTarget;
  131. extern const u8* gBattlescriptCurrInstr;
  132. extern u8 gCurrMovePos;
  133. extern u8 gCurrentActionFuncId;
  134. extern u32 gHitMarker;
  135. extern u8 gMoveResultFlags;
  136. extern u8 gBattleCommunication[];
  137. extern u16 gLastLandedMoves[4];
  138. extern u16 gLastHitByType[4];
  139. extern u8 gStringBank;
  140. extern u16 gDynamicBasePower;
  141. extern const u8 gTypeEffectiveness[];
  142. extern u16 gLastUsedItem;
  143. extern u16 gBattleMovePower;
  144. extern s32 gHpDealt;
  145. extern s32 gTakenDmg[MAX_BATTLERS_COUNT];
  146. extern u8 gTakenDmgBanks[MAX_BATTLERS_COUNT];
  147. extern const u16 gMissStringIds[];
  148. extern u8 gSentPokesToOpponent[2];
  149. extern u8 gBank1;
  150. extern u16 gExpShareExp;
  151. extern u8 gBattleTextBuff1[];
  152. extern u8 gBattleTextBuff2[];
  153. extern u8 gBattleTextBuff3[];
  154. extern u8 gLeveledUpInBattle;
  155. extern void (*gBattleMainFunc)(void);
  156. extern struct Window gUnknown_03004210;
  157. extern const u8 BattleText_YesNo[];
  158. extern u8 gPlayerPartyCount;
  159. extern u16 gMoveToLearn; //move to learn
  160. extern const u8 gTrainerMoney[];
  161. extern u16 gRandomMove;
  162. extern u8* gBattleScriptsForMoveEffects[];
  163. extern u16 gChosenMove; //last used move in battle
  164. extern u8 gBankInMenu;
  165. extern u8 gActionForBanks[4];
  166. extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch
  167. extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one
  168. extern u8 gCurrentTurnActionNumber;
  169. extern u16 gTrappingMoves[];
  170.  
  171. extern u8 BattleScript_MoveEffectSleep[];
  172. extern u8 BattleScript_MoveEffectPoison[];
  173. extern u8 BattleScript_MoveEffectBurn[];
  174. extern u8 BattleScript_MoveEffectFreeze[];
  175. extern u8 BattleScript_MoveEffectParalysis[];
  176. extern u8 BattleScript_MoveEffectToxic[];
  177. extern u8 BattleScript_MoveEffectConfusion[];
  178. extern u8 BattleScript_MoveEffectUproar[];
  179. extern u8 BattleScript_MoveEffectWrap[];
  180. extern u8 BattleScript_MoveEffectPayDay[];
  181. extern u8 BattleScript_MoveEffectRecoil33[];
  182.  
  183. //extern functions
  184. u8 AtkCanceller_UnableToUseMove(void);
  185. void PressurePPLose(u8 bank_atk, u8 bank_def, u16 move);
  186. void CancelMultiTurnMoves(u8 bank);
  187. void BattleScriptPush(const u8* BS_ptr);
  188. void BattleScriptPushCursor(void);
  189. void RecordAbilityBattle(u8 bank, u8 ability);
  190. void RecordItemBattle(u8 bank, u8 holdEffect);
  191. static bool8 IsTwoTurnsMove(u16 move);
  192. static void TrySetDestinyBondToHappen(void);
  193. static void CheckWonderGuardAndLevitate(void);
  194. u8 GetBattlerPosition(u8 bank);
  195. u8 GetBattlerSide(u8 bank);
  196. u8 GetBattleBank(u8 bankValue);
  197. s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def);
  198. static u8 AttacksThisTurn(u8 bank, u16 move); //Note: returns 1 if it's a charging turn, otherwise 2
  199. void UndoEffectsAfterFainting(void);
  200. void BattleStopLowHpSound(void);
  201. void PlayBGM(u16 songID);
  202. void MonGainEVs(struct Pokemon*, u16 defeatedSpecies);
  203. extern u8 gBattleBufferB[4][0x200];
  204. void HandleLowHpMusicChange(struct Pokemon*, u8 bank);
  205. bool8 IsTradedMon(struct Pokemon*);
  206. void BattleScriptPop(void);
  207. void SwitchInClearSetData(void);
  208. u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8);
  209. u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID);
  210. u16 SpeciesToNationalPokedexNum(u16 species);
  211. u8 sub_803FC34(u8 bank);
  212. u16 sub_803FBFC(u8 a);
  213. u8 GetBattlerAtPosition(u8 ID);
  214. void sub_8012258(u8);
  215. //MonTryLearningNewMove teach poke a move
  216. u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move);
  217. void IncrementGameStat(u8 index);
  218. u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale);
  219. u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight);
  220. u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
  221. void DestroyMenuCursor(void);
  222. void sub_802BC6C(void);
  223. u8 sub_809FA30(void);
  224. bool32 IsHMMove2(u16 move);
  225. void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0);
  226. void nullsub_6(void);
  227. void ReshowBattleScreenAfterMenu(void);
  228. void BattleMainCB2(void);
  229. void AddMoney(u32* moneySaveblock, u32 to_give);
  230. u8 CountAliveMons(u8 caseID);
  231. void PokemonUseItemEffects(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp);
  232. u8 CanRunFromBattle(void);
  233. u8 GetMoveTarget(u16 move, u8 targetbyte); //get target of move
  234. u8 CastformDataTypeChange(u8 bank);
  235. u8 Overworld_GetMapTypeOfSaveblockLocation(void);
  236. u8 CalculatePlayerPartyCount(void);
  237. u16 Sqrt(u32 num);
  238. u8 sub_809070C(u16 nationalNum, u32 TiD, u32 PiD); //task prepare poke dex display
  239. void MenuCursor_SetPos814A880(u8 a1, u8 a2);
  240. u8 CheckMoveLimitations(u8 bank, u8 unusable_moves, u8 flags);
  241. bool8 IsLinkDoubleBattle(void);
  242. void sub_8094B6C(u8 bank, u8 partyID, u8 r2);
  243.  
  244. //extern BattleScripts
  245. extern u8 BattleScript_MoveEnd[];
  246. extern u8 BattleScript_NoPPForMove[];
  247. extern u8 BattleScript_MagicCoatBounce[];
  248. extern u8 BattleScript_TookAttack[];
  249. extern u8 BattleScript_SnatchedMove[];
  250. extern u8 BattleScript_Pausex20[];
  251. extern u8 BattleScript_SubstituteFade[];
  252. extern u8 BattleScript_HangedOnMsg[];
  253. extern u8 BattleScript_OneHitKOMsg[];
  254. extern u8 BattleScript_EnduredMsg[];
  255. extern u8 BattleScript_PSNPrevention[];
  256. extern u8 BattleScript_BRNPrevention[];
  257. extern u8 BattleScript_PRLZPrevention[];
  258. extern u8 BattleScript_FlinchPrevention[];
  259. extern u8 BattleScript_StatUp[];
  260. extern u8 BattleScript_StatDown[];
  261. extern u8 BattleScript_NoItemSteal[];
  262. extern u8 BattleScript_ItemSteal[];
  263. extern u8 BattleScript_RapidSpinAway[];
  264. extern u8 BattleScript_TargetPRLZHeal[];
  265. extern u8 BattleScript_KnockedOff[];
  266. extern u8 BattleScript_LevelUp[];
  267. extern u8 BattleScript_WrapFree[];
  268. extern u8 BattleScript_LeechSeedFree[];
  269. extern u8 BattleScript_SpikesFree[];
  270. extern u8 BattleScript_ButItFailed[];
  271. extern u8 BattleScript_ObliviousPreventsAttraction[];
  272. extern u8 BattleScript_MistProtected[];
  273. extern u8 BattleScript_AbilityNoStatLoss[];
  274. extern u8 BattleScript_AbilityNoSpecificStatLoss[];
  275. extern u8 BattleScript_TrainerBallBlock[];
  276. extern u8 BattleScript_WallyBallThrow[];
  277. extern u8 BattleScript_SuccessBallThrow[];
  278. extern u8 BattleScript_ShakeBallThrow[];
  279. extern u8 BattleScript_AllStatsUp[];
  280. extern u8 BattleScript_AtkDefDown[];
  281. extern u8 BattleScript_SAtkDown2[];
  282.  
  283. extern u8 BattleScript_SpikesOnTarget[]; //spikes1
  284. extern u8 BattleScript_SpikesOnAttacker[]; //spikes2
  285. extern u8 BattleScript_SpikesOngBank1[]; //spikes3
  286. extern u8 BattleScript_HitFromCritCalc[]; //present dmg
  287. extern u8 BattleScript_AlreadyAtFullHp[]; //present full hp
  288. extern u8 BattleScript_PresentHealTarget[]; //present hp heal
  289. extern u8 BattleScript_MoveMissedPause[];
  290. extern u8 BattleScript_CastformChange[];
  291. extern u8 BattleScript_DampStopsExplosion[];
  292. extern u8 BattleScript_SuccessForceOut[]; //bs random switchout
  293. extern u8 BattleScript_PrintPayDayMoneyString[]; //bs payday money give
  294. extern u8 BattleScript_FaintAttacker[];
  295. extern u8 BattleScript_FaintTarget[];
  296. extern u8 BattleScript_DestinyBondTakesLife[];
  297. extern u8 BattleScript_SelectingImprisionedMoveInPalace[];
  298.  
  299. // read via orr
  300. #define BSScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24)
  301. #define BSScriptRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
  302. #define BSScriptReadPtr(ptr) ((void *)BSScriptRead32(ptr))
  303.  
  304. // read via add
  305. #define BS2ScriptRead32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))
  306. #define BS2ScriptRead16(ptr) ((ptr)[0] + ((ptr)[1] << 8))
  307. #define BS2ScriptReadPtr(ptr) ((void *)BS2ScriptRead32(ptr))
  308.  
  309. #define TARGET_PROTECT_AFFECTED ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_PROTECT))
  310.  
  311. //array entries for battle communication
  312. #define MOVE_EFFECT_BYTE    0x3
  313. #define MULTISTRING_CHOOSER 0x5
  314. #define MSG_DISPLAY         0x7
  315.  
  316. #define TARGET_SELECTED         0x0
  317. #define TARGET_DEPENDS          0x1
  318. #define TARGET_BOTH             0x8
  319. #define TARGET_FOES_AND_ALLY    0x20
  320. #define TARGET_OPPONENTS_FIELD  0x40
  321.  
  322. #define TYPE_FORESIGHT  0xFE
  323. #define TYPE_ENDTABLE   0xFF
  324.  
  325. #define CMP_EQUAL               0x0
  326. #define CMP_NOT_EQUAL           0x1
  327. #define CMP_GREATER_THAN        0x2
  328. #define CMP_LESS_THAN           0x3
  329. #define CMP_COMMON_BITS         0x4
  330. #define CMP_NO_COMMON_BITS      0x5
  331.  
  332. #define uBYTE0_16(value)(( (u8) (((u16)(value) & (0x000000FF)) >> 0x00)))
  333. #define uBYTE1_16(value)(( (u8) (((u16)(value) & (0x0000FF00)) >> 0x08)))
  334.  
  335. #define uBYTE0_32(value)(( (u8) (((u32)(value) & (0x000000FF)) >> 0x00)))
  336. #define uBYTE1_32(value)(( (u8) (((u32)(value) & (0x0000FF00)) >> 0x08)))
  337. #define uBYTE2_32(value)(( (u8) (((u32)(value) & (0x00FF0000)) >> 0x10)))
  338. #define uBYTE3_32(value)(( (u8) (((u32)(value) & (0xFF000000)) >> 0x18)))
  339.  
  340. #define sBYTE0_16(value)(( (u8) (((s16)(value) & (0x000000FF)) >> 0x00)))
  341. #define sBYTE1_16(value)(( (u8) (((s16)(value) & (0x0000FF00)) >> 0x08)))
  342.  
  343. #define sBYTE0_32(value)(( (u8) (((s32)(value) & (0x000000FF)) >> 0x00)))
  344. #define sBYTE1_32(value)(( (u8) (((s32)(value) & (0x0000FF00)) >> 0x08)))
  345. #define sBYTE2_32(value)(( (u8) (((s32)(value) & (0x00FF0000)) >> 0x10)))
  346. #define sBYTE3_32(value)(( (u8) (((s32)(value) & (0xFF000000)) >> 0x18)))
  347.  
  348. #define RecordAbilitySetField6(ability, fieldValue) \
  349. (gLastUsedAbility = ability, gBattleCommunication[6] = fieldValue, RecordAbilityBattle(gBankTarget, ability))
  350.  
  351. #define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)))
  352.  
  353. #define HP_ON_SWITCHOUT (((u16*)(ewram_addr + 0x160BC)))
  354.  
  355. static void atk00_attackcanceler(void);
  356. static void atk01_accuracycheck(void);
  357. static void atk02_attackstring(void);
  358. static void atk03_ppreduce(void);
  359. static void atk04_critcalc(void);
  360. static void atk05_damagecalc(void);
  361. static void atk06_typecalc(void);
  362. static void atk07_adjustnormaldamage(void);
  363. static void atk08_adjustnormaldamage2(void);
  364. static void atk09_attackanimation(void);
  365. static void atk0A_waitanimation(void);
  366. static void atk0B_healthbarupdate(void);
  367. static void atk0C_datahpupdate(void);
  368. static void atk0D_critmessage(void);
  369. static void atk0E_effectivenesssound(void);
  370. static void atk0F_resultmessage(void);
  371. static void atk10_printstring(void);
  372. static void atk11_printselectionstring(void);
  373. static void atk12_waitmessage(void);
  374. static void atk13_printfromtable(void);
  375. static void atk14_printselectionstringfromtable(void);
  376. static void atk15_seteffectwithchance(void);
  377. static void atk16_seteffectprimary(void);
  378. static void atk17_seteffectsecondary(void);
  379. static void atk18_clearstatusfromeffect(void);
  380. static void atk19_tryfaintmon(void);
  381. static void atk1A_dofaintanimation(void);
  382. static void atk1B_cleareffectsonfaint(void);
  383. static void atk1C_jumpifstatus(void);
  384. static void atk1D_jumpifstatus2(void);
  385. static void atk1E_jumpifability(void);
  386. static void atk1F_jumpifsideaffecting(void);
  387. static void atk20_jumpifstat(void);
  388. static void atk21_jumpifstatus3condition(void);
  389. static void atk22_jumpiftype(void);
  390. static void atk23_getexp(void);
  391. static void atk24(void);
  392. static void atk25_movevaluescleanup(void);
  393. static void atk26_setmultihit(void);
  394. static void atk27_decrementmultihit(void);
  395. static void atk28_goto(void);
  396. static void atk29_jumpifbyte(void);
  397. static void atk2A_jumpifhalfword(void);
  398. static void atk2B_jumpifword(void);
  399. static void atk2C_jumpifarrayequal(void);
  400. static void atk2D_jumpifarraynotequal(void);
  401. static void atk2E_setbyte(void);
  402. static void atk2F_addbyte(void);
  403. static void atk30_subbyte(void);
  404. static void atk31_copyarray(void);
  405. static void atk32_copyarraywithindex(void);
  406. static void atk33_orbyte(void);
  407. static void atk34_orhalfword(void);
  408. static void atk35_orword(void);
  409. static void atk36_bicbyte(void);
  410. static void atk37_bichalfword(void);
  411. static void atk38_bicword(void);
  412. static void atk39_pause(void);
  413. static void atk3A_waitstate(void);
  414. static void atk3B_healthbar_update(void);
  415. static void atk3C_return(void);
  416. static void atk3D_end(void);
  417. static void atk3E_end2(void);
  418. static void atk3F_end3(void);
  419. static void atk40_jumpifaffectedbyprotect(void);
  420. static void atk41_call(void);
  421. static void atk42_jumpiftype2(void);
  422. static void atk43_jumpifabilitypresent(void);
  423. static void atk44_endselectionscript(void);
  424. static void atk45_playanimation(void);
  425. static void atk46_playanimation2(void);
  426. static void atk47_setgraphicalstatchangevalues(void);
  427. static void atk48_playstatchangeanimation(void);
  428. void atk49_moveend(void);
  429. static void atk4A_typecalc2(void);
  430. static void atk4B_returnatktoball(void);
  431. static void atk4C_getswitchedmondata(void);
  432. static void atk4D_switchindataupdate(void);
  433. static void atk4E_switchinanim(void);
  434. static void atk4F_jumpifcantswitch(void);
  435. static void atk50_openpartyscreen(void);
  436. static void atk51_switchhandleorder(void);
  437. static void atk52_switchineffects(void);
  438. static void atk53_trainerslidein(void);
  439. static void atk54_playse(void);
  440. static void atk55_fanfare(void);
  441. static void atk56_playfaintcry(void);
  442. static void atk57(void);
  443. static void atk58_returntoball(void);
  444. void atk59_handlelearnnewmove(void);
  445. static void atk5A_yesnoboxlearnmove(void);
  446. static void atk5B_yesnoboxstoplearningmove(void);
  447. static void atk5C_hitanimation(void);
  448. static void atk5D_getmoneyreward(void);
  449. static void atk5E_8025A70(void);
  450. static void atk5F_8025B24(void);
  451. static void atk60_incrementgamestat(void);
  452. static void atk61_drawpartystatussummary(void);
  453. static void atk62_08025C6C(void);
  454. static void atk63_jumptorandomattack(void);
  455. static void atk64_statusanimation(void);
  456. static void atk65_status2animation(void);
  457. static void atk66_chosenstatusanimation(void);
  458. static void atk67_yesnobox(void);
  459. static void atk68_cancelallactions(void);
  460. static void atk69_adjustsetdamage(void);
  461. void atk6A_removeitem(void);
  462. static void atk6B_atknameinbuff1(void);
  463. static void atk6C_drawlvlupbox(void);
  464. static void atk6D_resetsentmonsvalue(void);
  465. static void atk6E_setatktoplayer0(void);
  466. static void atk6F_makevisible(void);
  467. static void atk70_recordlastability(void);
  468. static void atk71_buffermovetolearn(void);
  469. static void atk72_jumpifplayerran(void);
  470. static void atk73_hpthresholds(void);
  471. static void atk74_hpthresholds2(void);
  472. static void atk75_useitemonopponent(void);
  473. static void atk76_various(void);
  474. static void atk77_setprotectlike(void);
  475. static void atk78_faintifabilitynotdamp(void);
  476. static void atk79_setatkhptozero(void);
  477. static void atk7A_jumpifnexttargetvalid(void);
  478. static void atk7B_tryhealhalfhealth(void);
  479. static void atk7C_trymirrormove(void);
  480. static void atk7D_setrain(void);
  481. static void atk7E_setreflect(void);
  482. static void atk7F_setseeded(void);
  483. static void atk80_manipulatedamage(void);
  484. static void atk81_trysetrest(void);
  485. static void atk82_jumpifnotfirstturn(void);
  486. static void atk83_nop(void);
  487. static void atk84_jumpifcantmakeasleep(void);
  488. static void atk85_stockpile(void);
  489. static void atk86_stockpiletobasedamage(void);
  490. static void atk87_stockpiletohpheal(void);
  491. static void atk88_negativedamage(void);
  492. static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr);
  493. static void atk89_statbuffchange(void);
  494. static void atk8A_normalisebuffs(void);
  495. static void atk8B_setbide(void);
  496. static void atk8C_confuseifrepeatingattackends(void);
  497. static void atk8D_setmultihitcounter(void);
  498. static void atk8E_initmultihitstring(void);
  499. static void atk8F_forcerandomswitch(void);
  500. static void atk90_tryconversiontypechange(void);
  501. static void atk91_givepaydaymoney(void);
  502. static void atk92_setlightscreen(void);
  503. static void atk93_tryKO(void);
  504. static void atk94_damagetohalftargethp(void);
  505. static void atk95_setsandstorm(void);
  506. static void atk96_weatherdamage(void);
  507. static void atk97_tryinfatuating(void);
  508. static void atk98_updatestatusicon(void);
  509. static void atk99_setmist(void);
  510. static void atk9A_setfocusenergy(void);
  511. static void atk9B_transformdataexecution(void);
  512. static void atk9C_setsubstitute(void);
  513. static void atk9D_mimicattackcopy(void);
  514. static void atk9E_metronome(void);
  515. static void atk9F_dmgtolevel(void);
  516. static void atkA0_psywavedamageeffect(void);
  517. static void atkA1_counterdamagecalculator(void);
  518. static void atkA2_mirrorcoatdamagecalculator(void);
  519. static void atkA3_disablelastusedattack(void);
  520. static void atkA4_trysetencore(void);
  521. static void atkA5_painsplitdmgcalc(void);
  522. static void atkA6_settypetorandomresistance(void);
  523. static void atkA7_setalwayshitflag(void);
  524. static void atkA8_copymovepermanently(void);
  525. static void atkA9_trychoosesleeptalkmove(void);
  526. static void atkAA_setdestinybond(void);
  527. static void atkAB_trysetdestinybondtohappen(void);
  528. static void atkAC_remaininghptopower(void);
  529. static void atkAD_tryspiteppreduce(void);
  530. static void atkAE_healpartystatus(void);
  531. static void atkAF_cursetarget(void);
  532. static void atkB0_trysetspikes(void);
  533. static void atkB1_setforesight(void);
  534. static void atkB2_trysetperishsong(void);
  535. static void atkB3_rolloutdamagecalculation(void);
  536. static void atkB4_jumpifconfusedandstatmaxed(void);
  537. static void atkB5_furycuttercalc(void);
  538. static void atkB6_happinesstodamagecalculation(void);
  539. static void atkB7_presentdamagecalculation(void);
  540. static void atkB8_setsafeguard(void);
  541. static void atkB9_magnitudedamagecalculation(void);
  542. static void atkBA_jumpifnopursuitswitchdmg(void);
  543. static void atkBB_setsunny(void);
  544. static void atkBC_maxattackhalvehp(void);
  545. static void atkBD_copyfoestats(void);
  546. static void atkBE_rapidspinfree(void);
  547. static void atkBF_setdefensecurlbit(void);
  548. static void atkC0_recoverbasedonsunlight(void);
  549. static void atkC1_hiddenpowercalc(void);
  550. static void atkC2_selectfirstvalidtarget(void);
  551. static void atkC3_trysetfutureattack(void);
  552. static void atkC4_trydobeatup(void);
  553. static void atkC5_setsemiinvulnerablebit(void);
  554. static void atkC6_clearsemiinvulnerablebit(void);
  555. static void atkC7_setminimize(void);
  556. static void atkC8_sethail(void);
  557. static void atkC9_jumpifattackandspecialattackcannotfall(void);
  558. static void atkCA_setforcedtarget(void);
  559. static void atkCB_setcharge(void);
  560. static void atkCC_callterrainattack(void);
  561. static void atkCD_cureifburnedparalysedorpoisoned(void);
  562. static void atkCE_settorment(void);
  563. static void atkCF_jumpifnodamage(void);
  564. static void atkD0_settaunt(void);
  565. static void atkD1_trysethelpinghand(void);
  566. static void atkD2_tryswapitems(void);
  567. static void atkD3_trycopyability(void);
  568. static void atkD4_trywish(void);
  569. static void atkD5_trysetroots(void);
  570. static void atkD6_doubledamagedealtifdamaged(void);
  571. static void atkD7_setyawn(void);
  572. static void atkD8_setdamagetohealthdifference(void);
  573. static void atkD9_scaledamagebyhealthratio(void);
  574. static void atkDA_tryswapabilities(void);
  575. static void atkDB_tryimprision(void);
  576. static void atkDC_trysetgrudge(void);
  577. static void atkDD_weightdamagecalculation(void);
  578. static void atkDE_asistattackselect(void);
  579. static void atkDF_trysetmagiccoat(void);
  580. static void atkE0_trysetsnatch(void);
  581. static void atkE1_trygetintimidatetarget(void);
  582. static void atkE2_switchoutabilities(void);
  583. static void atkE3_jumpifhasnohp(void);
  584. static void atkE4_getsecretpowereffect(void);
  585. static void atkE5_pickup(void);
  586. static void atkE6_docastformchangeanimation(void);
  587. static void atkE7_trycastformdatachange(void);
  588. static void atkE8_settypebasedhalvers(void);
  589. static void atkE9_setweatherballtype(void);
  590. static void atkEA_tryrecycleitem(void);
  591. static void atkEB_settypetoterrain(void);
  592. static void atkEC_pursuitrelated(void);
  593. static void atkED_snatchsetbanks(void);
  594. static void atkEE_removelightscreenreflect(void);
  595. void atkEF_handleballthrow(void);
  596. static void atkF0_givecaughtmon(void);
  597. static void atkF1_trysetcaughtmondexflags(void);
  598. static void atkF2_displaydexinfo(void);
  599. static void atkF3_trygivecaughtmonnick(void);
  600. static void atkF4_subattackerhpbydmg(void);
  601. static void atkF5_removeattackerstatus1(void);
  602. static void atkF6_finishaction(void);
  603. static void atkF7_finishturn(void);
  604.  
  605. void (* const gBattleScriptingCommandsTable[])(void) =
  606. {
  607.     atk00_attackcanceler,
  608.     atk01_accuracycheck,
  609.     atk02_attackstring,
  610.     atk03_ppreduce,
  611.     atk04_critcalc,
  612.     atk05_damagecalc,
  613.     atk06_typecalc,
  614.     atk07_adjustnormaldamage,
  615.     atk08_adjustnormaldamage2,
  616.     atk09_attackanimation,
  617.     atk0A_waitanimation,
  618.     atk0B_healthbarupdate,
  619.     atk0C_datahpupdate,
  620.     atk0D_critmessage,
  621.     atk0E_effectivenesssound,
  622.     atk0F_resultmessage,
  623.     atk10_printstring,
  624.     atk11_printselectionstring,
  625.     atk12_waitmessage,
  626.     atk13_printfromtable,
  627.     atk14_printselectionstringfromtable,
  628.     atk15_seteffectwithchance,
  629.     atk16_seteffectprimary,
  630.     atk17_seteffectsecondary,
  631.     atk18_clearstatusfromeffect,
  632.     atk19_tryfaintmon,
  633.     atk1A_dofaintanimation,
  634.     atk1B_cleareffectsonfaint,
  635.     atk1C_jumpifstatus,
  636.     atk1D_jumpifstatus2,
  637.     atk1E_jumpifability,
  638.     atk1F_jumpifsideaffecting,
  639.     atk20_jumpifstat,
  640.     atk21_jumpifstatus3condition,
  641.     atk22_jumpiftype,
  642.     atk23_getexp,
  643.     atk24,
  644.     atk25_movevaluescleanup,
  645.     atk26_setmultihit,
  646.     atk27_decrementmultihit,
  647.     atk28_goto,
  648.     atk29_jumpifbyte,
  649.     atk2A_jumpifhalfword,
  650.     atk2B_jumpifword,
  651.     atk2C_jumpifarrayequal,
  652.     atk2D_jumpifarraynotequal,
  653.     atk2E_setbyte,
  654.     atk2F_addbyte,
  655.     atk30_subbyte,
  656.     atk31_copyarray,
  657.     atk32_copyarraywithindex,
  658.     atk33_orbyte,
  659.     atk34_orhalfword,
  660.     atk35_orword,
  661.     atk36_bicbyte,
  662.     atk37_bichalfword,
  663.     atk38_bicword,
  664.     atk39_pause,
  665.     atk3A_waitstate,
  666.     atk3B_healthbar_update,
  667.     atk3C_return,
  668.     atk3D_end,
  669.     atk3E_end2,
  670.     atk3F_end3,
  671.     atk40_jumpifaffectedbyprotect,
  672.     atk41_call,
  673.     atk42_jumpiftype2,
  674.     atk43_jumpifabilitypresent,
  675.     atk44_endselectionscript,
  676.     atk45_playanimation,
  677.     atk46_playanimation2,
  678.     atk47_setgraphicalstatchangevalues,
  679.     atk48_playstatchangeanimation,
  680.     atk49_moveend,
  681.     atk4A_typecalc2,
  682.     atk4B_returnatktoball,
  683.     atk4C_getswitchedmondata,
  684.     atk4D_switchindataupdate,
  685.     atk4E_switchinanim,
  686.     atk4F_jumpifcantswitch,
  687.     atk50_openpartyscreen,
  688.     atk51_switchhandleorder,
  689.     atk52_switchineffects,
  690.     atk53_trainerslidein,
  691.     atk54_playse,
  692.     atk55_fanfare,
  693.     atk56_playfaintcry,
  694.     atk57,
  695.     atk58_returntoball,
  696.     atk59_handlelearnnewmove,
  697.     atk5A_yesnoboxlearnmove,
  698.     atk5B_yesnoboxstoplearningmove,
  699.     atk5C_hitanimation,
  700.     atk5D_getmoneyreward,
  701.     atk5E_8025A70,
  702.     atk5F_8025B24,
  703.     atk60_incrementgamestat,
  704.     atk61_drawpartystatussummary,
  705.     atk62_08025C6C,
  706.     atk63_jumptorandomattack,
  707.     atk64_statusanimation,
  708.     atk65_status2animation,
  709.     atk66_chosenstatusanimation,
  710.     atk67_yesnobox,
  711.     atk68_cancelallactions,
  712.     atk69_adjustsetdamage,
  713.     atk6A_removeitem,
  714.     atk6B_atknameinbuff1,
  715.     atk6C_drawlvlupbox,
  716.     atk6D_resetsentmonsvalue,
  717.     atk6E_setatktoplayer0,
  718.     atk6F_makevisible,
  719.     atk70_recordlastability,
  720.     atk71_buffermovetolearn,
  721.     atk72_jumpifplayerran,
  722.     atk73_hpthresholds,
  723.     atk74_hpthresholds2,
  724.     atk75_useitemonopponent,
  725.     atk76_various,
  726.     atk77_setprotectlike,
  727.     atk78_faintifabilitynotdamp,
  728.     atk79_setatkhptozero,
  729.     atk7A_jumpifnexttargetvalid,
  730.     atk7B_tryhealhalfhealth,
  731.     atk7C_trymirrormove,
  732.     atk7D_setrain,
  733.     atk7E_setreflect,
  734.     atk7F_setseeded,
  735.     atk80_manipulatedamage,
  736.     atk81_trysetrest,
  737.     atk82_jumpifnotfirstturn,
  738.     atk83_nop,
  739.     atk84_jumpifcantmakeasleep,
  740.     atk85_stockpile,
  741.     atk86_stockpiletobasedamage,
  742.     atk87_stockpiletohpheal,
  743.     atk88_negativedamage,
  744.     atk89_statbuffchange,
  745.     atk8A_normalisebuffs,
  746.     atk8B_setbide,
  747.     atk8C_confuseifrepeatingattackends,
  748.     atk8D_setmultihitcounter,
  749.     atk8E_initmultihitstring,
  750.     atk8F_forcerandomswitch,
  751.     atk90_tryconversiontypechange,
  752.     atk91_givepaydaymoney,
  753.     atk92_setlightscreen,
  754.     atk93_tryKO,
  755.     atk94_damagetohalftargethp,
  756.     atk95_setsandstorm,
  757.     atk96_weatherdamage,
  758.     atk97_tryinfatuating,
  759.     atk98_updatestatusicon,
  760.     atk99_setmist,
  761.     atk9A_setfocusenergy,
  762.     atk9B_transformdataexecution,
  763.     atk9C_setsubstitute,
  764.     atk9D_mimicattackcopy,
  765.     atk9E_metronome,
  766.     atk9F_dmgtolevel,
  767.     atkA0_psywavedamageeffect,
  768.     atkA1_counterdamagecalculator,
  769.     atkA2_mirrorcoatdamagecalculator,
  770.     atkA3_disablelastusedattack,
  771.     atkA4_trysetencore,
  772.     atkA5_painsplitdmgcalc,
  773.     atkA6_settypetorandomresistance,
  774.     atkA7_setalwayshitflag,
  775.     atkA8_copymovepermanently,
  776.     atkA9_trychoosesleeptalkmove,
  777.     atkAA_setdestinybond,
  778.     atkAB_trysetdestinybondtohappen,
  779.     atkAC_remaininghptopower,
  780.     atkAD_tryspiteppreduce,
  781.     atkAE_healpartystatus,
  782.     atkAF_cursetarget,
  783.     atkB0_trysetspikes,
  784.     atkB1_setforesight,
  785.     atkB2_trysetperishsong,
  786.     atkB3_rolloutdamagecalculation,
  787.     atkB4_jumpifconfusedandstatmaxed,
  788.     atkB5_furycuttercalc,
  789.     atkB6_happinesstodamagecalculation,
  790.     atkB7_presentdamagecalculation,
  791.     atkB8_setsafeguard,
  792.     atkB9_magnitudedamagecalculation,
  793.     atkBA_jumpifnopursuitswitchdmg,
  794.     atkBB_setsunny,
  795.     atkBC_maxattackhalvehp,
  796.     atkBD_copyfoestats,
  797.     atkBE_rapidspinfree,
  798.     atkBF_setdefensecurlbit,
  799.     atkC0_recoverbasedonsunlight,
  800.     atkC1_hiddenpowercalc,
  801.     atkC2_selectfirstvalidtarget,
  802.     atkC3_trysetfutureattack,
  803.     atkC4_trydobeatup,
  804.     atkC5_setsemiinvulnerablebit,
  805.     atkC6_clearsemiinvulnerablebit,
  806.     atkC7_setminimize,
  807.     atkC8_sethail,
  808.     atkC9_jumpifattackandspecialattackcannotfall,
  809.     atkCA_setforcedtarget,
  810.     atkCB_setcharge,
  811.     atkCC_callterrainattack,
  812.     atkCD_cureifburnedparalysedorpoisoned,
  813.     atkCE_settorment,
  814.     atkCF_jumpifnodamage,
  815.     atkD0_settaunt,
  816.     atkD1_trysethelpinghand,
  817.     atkD2_tryswapitems,
  818.     atkD3_trycopyability,
  819.     atkD4_trywish,
  820.     atkD5_trysetroots,
  821.     atkD6_doubledamagedealtifdamaged,
  822.     atkD7_setyawn,
  823.     atkD8_setdamagetohealthdifference,
  824.     atkD9_scaledamagebyhealthratio,
  825.     atkDA_tryswapabilities,
  826.     atkDB_tryimprision,
  827.     atkDC_trysetgrudge,
  828.     atkDD_weightdamagecalculation,
  829.     atkDE_asistattackselect,
  830.     atkDF_trysetmagiccoat,
  831.     atkE0_trysetsnatch,
  832.     atkE1_trygetintimidatetarget,
  833.     atkE2_switchoutabilities,
  834.     atkE3_jumpifhasnohp,
  835.     atkE4_getsecretpowereffect,
  836.     atkE5_pickup,
  837.     atkE6_docastformchangeanimation,
  838.     atkE7_trycastformdatachange,
  839.     atkE8_settypebasedhalvers,
  840.     atkE9_setweatherballtype,
  841.     atkEA_tryrecycleitem,
  842.     atkEB_settypetoterrain,
  843.     atkEC_pursuitrelated,
  844.     atkED_snatchsetbanks,
  845.     atkEE_removelightscreenreflect,
  846.     atkEF_handleballthrow,
  847.     atkF0_givecaughtmon,
  848.     atkF1_trysetcaughtmondexflags,
  849.     atkF2_displaydexinfo,
  850.     atkF3_trygivecaughtmonnick,
  851.     atkF4_subattackerhpbydmg,
  852.     atkF5_removeattackerstatus1,
  853.     atkF6_finishaction,
  854.     atkF7_finishturn,
  855. };
  856.  
  857. struct StatFractions
  858. {
  859.     u8 dividend;
  860.     u8 divisor;
  861. };
  862.  
  863. static const struct StatFractions gAccuracyStageRatios[] =
  864. {
  865.     { 33, 100}, // -6
  866.     { 36, 100}, // -5
  867.     { 43, 100}, // -4
  868.     { 50, 100}, // -3
  869.     { 60, 100}, // -2
  870.     { 75, 100}, // -1
  871.     {  1,   1}, //  0
  872.     {133, 100}, // +1
  873.     {166, 100}, // +2
  874.     {  2,   1}, // +3
  875.     {233, 100}, // +4
  876.     {133,  50}, // +5
  877.     {  3,   1}, // +6
  878. };
  879.  
  880. // The chance is 1/N for each stage.
  881. static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
  882.  
  883. static const u32 sStatusFlagsForMoveEffects[] =
  884. {
  885.     0x00000000,
  886.     STATUS_SLEEP,
  887.     STATUS_POISON,
  888.     STATUS_BURN,
  889.     STATUS_FREEZE,
  890.     STATUS_PARALYSIS,
  891.     STATUS_TOXIC_POISON,
  892.     STATUS2_CONFUSION,
  893.     STATUS2_FLINCHED,
  894.     0x00000000,
  895.     STATUS2_UPROAR,
  896.     0x00000000,
  897.     STATUS2_MULTIPLETURNS,
  898.     STATUS2_WRAPPED,
  899.     0x00000000,
  900.     0x00000000,
  901.     0x00000000,
  902.     0x00000000,
  903.     0x00000000,
  904.     0x00000000,
  905.     0x00000000,
  906.     0x00000000,
  907.     0x00000000,
  908.     0x00000000,
  909.     0x00000000,
  910.     0x00000000,
  911.     0x00000000,
  912.     0x00000000,
  913.     0x00000000,
  914.     STATUS2_RECHARGE,
  915.     0x00000000,
  916.     0x00000000,
  917.     STATUS2_ESCAPE_PREVENTION,
  918.     STATUS2_NIGHTMARE,
  919.     0x00000000,
  920.     0x00000000,
  921.     0x00000000,
  922.     0x00000000,
  923.     0x00000000,
  924.     0x00000000,
  925.     0x00000000,
  926.     0x00000000,
  927.     0x00000000,
  928.     0x00000000,
  929.     0x00000000,
  930.     0x00000000,
  931.     0x00000000,
  932.     0x00000000,
  933.     0x00000000,
  934.     0x00000000,
  935.     0x00000000,
  936.     0x00000000,
  937.     0x00000000,
  938.     STATUS2_LOCK_CONFUSE,
  939.     0x00000000,
  940.     0x00000000,
  941.     0x00000000,
  942.     0x00000000,
  943.     0x00000000,
  944.     0x00000000
  945. };
  946.  
  947. u8* const gMoveEffectBS_Ptrs[] =
  948. {
  949.     BattleScript_MoveEffectSleep,
  950.     BattleScript_MoveEffectSleep,
  951.     BattleScript_MoveEffectPoison,
  952.     BattleScript_MoveEffectBurn,
  953.     BattleScript_MoveEffectFreeze,
  954.     BattleScript_MoveEffectParalysis,
  955.     BattleScript_MoveEffectToxic,
  956.     BattleScript_MoveEffectConfusion,
  957.     BattleScript_MoveEffectSleep,
  958.     BattleScript_MoveEffectSleep,
  959.     BattleScript_MoveEffectUproar,
  960.     BattleScript_MoveEffectPayDay,
  961.     BattleScript_MoveEffectSleep,
  962.     BattleScript_MoveEffectWrap,
  963.     BattleScript_MoveEffectRecoil33,
  964.     BattleScript_MoveEffectSleep,
  965.     BattleScript_MoveEffectSleep,
  966.     BattleScript_MoveEffectSleep,
  967.     BattleScript_MoveEffectSleep,
  968.     BattleScript_MoveEffectSleep,
  969.     BattleScript_MoveEffectSleep,
  970.     BattleScript_MoveEffectSleep,
  971.     BattleScript_MoveEffectSleep,
  972.     BattleScript_MoveEffectSleep,
  973.     BattleScript_MoveEffectSleep,
  974.     BattleScript_MoveEffectSleep,
  975.     BattleScript_MoveEffectSleep,
  976.     BattleScript_MoveEffectSleep,
  977.     BattleScript_MoveEffectSleep,
  978.     BattleScript_MoveEffectSleep,
  979.     BattleScript_MoveEffectSleep,
  980.     BattleScript_MoveEffectSleep,
  981.     BattleScript_MoveEffectSleep,
  982.     BattleScript_MoveEffectSleep,
  983.     BattleScript_MoveEffectSleep,
  984.     BattleScript_MoveEffectSleep,
  985.     BattleScript_MoveEffectSleep,
  986.     BattleScript_MoveEffectSleep,
  987.     BattleScript_MoveEffectRecoil33
  988. };
  989.  
  990. const u8 sUnreferencedBitMask1[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F};
  991.  
  992. const u8 gLevelUpStatBoxStats[] =
  993. {
  994.     MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK,
  995.     MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED
  996. };
  997.  
  998. static const u16 sProtectSuccessRates[] = {0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF};
  999.  
  1000. #define MIMIC_FORBIDDEN_END             0xFFFE
  1001. #define METRONOME_FORBIDDEN_END         0xFFFF
  1002. #define ASSIST_FORBIDDEN_END            0xFFFF
  1003.  
  1004. static const u16 sMovesForbiddenToCopy[] =
  1005. {
  1006.      MOVE_METRONOME,
  1007.      MOVE_STRUGGLE,
  1008.      MOVE_SKETCH,
  1009.      MOVE_MIMIC,
  1010.      MIMIC_FORBIDDEN_END,
  1011.      MOVE_COUNTER,
  1012.      MOVE_MIRROR_COAT,
  1013.      MOVE_PROTECT,
  1014.      MOVE_DETECT,
  1015.      MOVE_ENDURE,
  1016.      MOVE_DESTINY_BOND,
  1017.      MOVE_SLEEP_TALK,
  1018.      MOVE_THIEF,
  1019.      MOVE_FOLLOW_ME,
  1020.      MOVE_SNATCH,
  1021.      MOVE_HELPING_HAND,
  1022.      MOVE_COVET,
  1023.      MOVE_TRICK,
  1024.      MOVE_FOCUS_PUNCH,
  1025.      METRONOME_FORBIDDEN_END
  1026. };
  1027.  
  1028. static const u8 sFlailHpScaleToPowerTable[] = //reversal+flail HP thresholds to power
  1029. {
  1030.     1, 200,
  1031.     4, 150,
  1032.     9, 100,
  1033.     16, 80,
  1034.     32, 40,
  1035.     48, 20
  1036. };
  1037.  
  1038. static const u16 sNaturePowerMoves[] =
  1039. {
  1040.     MOVE_STUN_SPORE,
  1041.     MOVE_RAZOR_LEAF,
  1042.     MOVE_EARTHQUAKE,
  1043.     MOVE_HYDRO_PUMP,
  1044.     MOVE_SURF,
  1045.     MOVE_BUBBLE_BEAM,
  1046.     MOVE_ROCK_SLIDE,
  1047.     MOVE_SHADOW_BALL,
  1048.     MOVE_SWIFT,
  1049.     MOVE_SWIFT
  1050. };
  1051.  
  1052. // weight-based damage table for Low Kick
  1053. // format: min. weight (hectograms), base power
  1054. static const u16 sWeightToDamageTable[] =
  1055. {
  1056.     100, 20,
  1057.     250, 40,
  1058.     500, 60,
  1059.     1000, 80,
  1060.     2000, 100,
  1061.     0xFFFF, 0xFFFF
  1062. };
  1063.  
  1064. static const u16 sPickupItemsL10[] =
  1065. {
  1066.     ITEM_POTION, 25,
  1067.     ITEM_ANTIDOTE, 35,
  1068.     ITEM_SUPER_POTION, 45,
  1069.     ITEM_GREAT_BALL, 55,
  1070.     ITEM_REPEL, 65,
  1071.     ITEM_ESCAPE_ROPE, 75,
  1072.     ITEM_FULL_HEAL, 85,
  1073.     ITEM_HYPER_POTION, 90,
  1074.     ITEM_STICK, 95,
  1075.     ITEM_ULTRA_BALL, 98,
  1076.     ITEM_KINGS_ROCK, 99,
  1077.     ITEM_LEFTOVERS, 1,
  1078. };
  1079.  
  1080. static const u16 sPickupItemsL20[] =
  1081. {
  1082.     ITEM_ANTIDOTE, 25,
  1083.     ITEM_SUPER_POTION, 35,
  1084.     ITEM_GREAT_BALL, 45,
  1085.     ITEM_REPEL, 55,
  1086.     ITEM_ESCAPE_ROPE, 65,
  1087.     ITEM_FULL_HEAL, 75,
  1088.     ITEM_HYPER_POTION, 80,
  1089.     ITEM_STICK, 83,
  1090.     ITEM_ULTRA_BALL, 86,
  1091.     ITEM_KINGS_ROCK, 87,
  1092.     ITEM_LEFTOVERS, 88,
  1093.     ITEM_SUN_STONE, 91,
  1094.     ITEM_MOON_STONE, 94,
  1095.     ITEM_DRAGON_SCALE, 97,
  1096.     ITEM_REVIVE, 99,
  1097.     ITEM_BIG_MUSHROOM, 1,
  1098. };
  1099.  
  1100. static const u16 sPickupItemsL30[] =
  1101. {
  1102.     ITEM_SUPER_POTION, 25,
  1103.     ITEM_GREAT_BALL, 35,
  1104.     ITEM_REPEL, 45,
  1105.     ITEM_ESCAPE_ROPE, 55,
  1106.     ITEM_FULL_HEAL, 65,
  1107.     ITEM_HYPER_POTION, 70,
  1108.     ITEM_ULTRA_BALL, 75,
  1109.     ITEM_KINGS_ROCK, 76,
  1110.     ITEM_LEFTOVERS, 77,
  1111.     ITEM_SUN_STONE, 82,
  1112.     ITEM_MOON_STONE, 87,
  1113.     ITEM_DRAGON_SCALE, 90,
  1114.     ITEM_REVIVE, 92,
  1115.     ITEM_BIG_MUSHROOM, 95,
  1116.     ITEM_RARE_CANDY, 98,
  1117.     ITEM_BIG_PEARL, 99,
  1118.     ITEM_FULL_RESTORE, 1,
  1119. };
  1120.  
  1121. static const u16 sPickupItemsL40[] =
  1122. {
  1123.     ITEM_GREAT_BALL, 25,
  1124.     ITEM_REPEL, 35,
  1125.     ITEM_ESCAPE_ROPE, 45,
  1126.     ITEM_FULL_HEAL, 55,
  1127.     ITEM_HYPER_POTION, 65,
  1128.     ITEM_ULTRA_BALL, 70,
  1129.     ITEM_KINGS_ROCK, 71,
  1130.     ITEM_LEFTOVERS, 72,
  1131.     ITEM_SUN_STONE, 77,
  1132.     ITEM_MOON_STONE, 82,
  1133.     ITEM_DRAGON_SCALE, 85,
  1134.     ITEM_REVIVE, 90,
  1135.     ITEM_RARE_CANDY, 93,
  1136.     ITEM_BIG_PEARL, 97,
  1137.     ITEM_FULL_RESTORE, 98,
  1138.     ITEM_NUGGET, 99,
  1139.     ITEM_ETHER, 91,
  1140. };
  1141.  
  1142. static const u16 sPickupItemsL50[] =
  1143. {
  1144.     ITEM_REPEL, 20,
  1145.     ITEM_ESCAPE_ROPE, 30,
  1146.     ITEM_FULL_HEAL, 40,
  1147.     ITEM_HYPER_POTION, 50,
  1148.     ITEM_ULTRA_BALL, 60,
  1149.     ITEM_KINGS_ROCK, 61,
  1150.     ITEM_LEFTOVERS, 62,
  1151.     ITEM_SUN_STONE, 72,
  1152.     ITEM_MOON_STONE, 82,
  1153.     ITEM_DRAGON_SCALE, 85,
  1154.     ITEM_REVIVE, 90,
  1155.     ITEM_RARE_CANDY, 93,
  1156.     ITEM_FULL_RESTORE, 95,
  1157.     ITEM_NUGGET, 99,
  1158.     ITEM_ETHER, 91,
  1159. };
  1160.  
  1161. static const u16 sPickupItemsL60[] =
  1162. {
  1163.     ITEM_ESCAPE_ROPE, 20,
  1164.     ITEM_FULL_HEAL, 30,
  1165.     ITEM_HYPER_POTION, 40,
  1166.     ITEM_ULTRA_BALL, 50,
  1167.     ITEM_KINGS_ROCK, 51,
  1168.     ITEM_LEFTOVERS, 52,
  1169.     ITEM_SUN_STONE, 62,
  1170.     ITEM_MOON_STONE, 72,
  1171.     ITEM_DRAGON_SCALE, 75,
  1172.     ITEM_REVIVE, 82,
  1173.     ITEM_RARE_CANDY, 90,
  1174.     ITEM_FULL_RESTORE, 93,
  1175.     ITEM_NUGGET, 98,
  1176.     ITEM_ETHER, 99,
  1177.     ITEM_HEART_SCALE, 1,
  1178. };
  1179.  
  1180. static const u16 sPickupItemsL70[] =
  1181. {
  1182.     ITEM_FULL_HEAL, 20,
  1183.     ITEM_HYPER_POTION, 30,
  1184.     ITEM_ULTRA_BALL, 40,
  1185.     ITEM_KINGS_ROCK, 41,
  1186.     ITEM_LEFTOVERS, 42,
  1187.     ITEM_SUN_STONE, 52,
  1188.     ITEM_MOON_STONE, 62,
  1189.     ITEM_DRAGON_SCALE, 65,
  1190.     ITEM_REVIVE, 75,
  1191.     ITEM_RARE_CANDY, 83,
  1192.     ITEM_FULL_RESTORE, 88,
  1193.     ITEM_NUGGET, 93,
  1194.     ITEM_HEART_SCALE, 97,
  1195.     ITEM_ELIXIR, 1,
  1196. };
  1197.  
  1198. static const u16 sPickupItemsL80[] =
  1199. {
  1200.     ITEM_HYPER_POTION, 20,
  1201.     ITEM_ULTRA_BALL, 30,
  1202.     ITEM_KINGS_ROCK, 31,
  1203.     ITEM_LEFTOVERS, 32,
  1204.     ITEM_SUN_STONE, 42,
  1205.     ITEM_MOON_STONE, 52,
  1206.     ITEM_DRAGON_SCALE, 55,
  1207.     ITEM_REVIVE, 65,
  1208.     ITEM_RARE_CANDY, 73,
  1209.     ITEM_FULL_RESTORE, 78,
  1210.     ITEM_NUGGET, 83,
  1211.     ITEM_HEART_SCALE, 93,
  1212.     ITEM_ELIXIR, 98,
  1213.     ITEM_MAX_REVIVE, 1,
  1214. };
  1215.  
  1216. static const u16 sPickupItemsL90[] =
  1217. {
  1218.     ITEM_ULTRA_BALL, 20,
  1219.     ITEM_KINGS_ROCK, 21,
  1220.     ITEM_LEFTOVERS, 22,
  1221.     ITEM_SUN_STONE, 32,
  1222.     ITEM_MOON_STONE, 42,
  1223.     ITEM_DRAGON_SCALE, 45,
  1224.     ITEM_REVIVE, 55,
  1225.     ITEM_RARE_CANDY, 63,
  1226.     ITEM_FULL_RESTORE, 73,
  1227.     ITEM_NUGGET, 78,
  1228.     ITEM_HEART_SCALE, 88,
  1229.     ITEM_MAX_REVIVE, 98,
  1230.     ITEM_PP_UP, 99,
  1231.     ITEM_MAX_ELIXIR, 1,
  1232. };
  1233.  
  1234. static const u16 sPickupItemsL100[] =
  1235. {
  1236.     ITEM_KINGS_ROCK, 1,
  1237.     ITEM_LEFTOVERS, 2,
  1238.     ITEM_SUN_STONE, 12,
  1239.     ITEM_MOON_STONE, 22,
  1240.     ITEM_DRAGON_SCALE, 25,
  1241.     ITEM_REVIVE, 45,
  1242.     ITEM_RARE_CANDY, 53,
  1243.     ITEM_FULL_RESTORE, 68,
  1244.     ITEM_NUGGET, 73,
  1245.     ITEM_HEART_SCALE, 83,
  1246.     ITEM_MAX_REVIVE, 93,
  1247.     ITEM_PP_UP, 97,
  1248.     ITEM_MAX_ELIXIR, 1,
  1249. };
  1250.  
  1251. static const u16* sPickupTables[] =
  1252. {
  1253.     sPickupItemsL10,
  1254.     sPickupItemsL20,
  1255.     sPickupItemsL30,
  1256.     sPickupItemsL40,
  1257.     sPickupItemsL50,
  1258.     sPickupItemsL60,
  1259.     sPickupItemsL70,
  1260.     sPickupItemsL80,
  1261.     sPickupItemsL90,
  1262.     sPickupItemsL100,
  1263. };
  1264.  
  1265. static const u8 sTerrainToType[] =
  1266. {
  1267.     TYPE_GRASS, // tall grass
  1268.     TYPE_GRASS, // long grass
  1269.     TYPE_GROUND, // sand
  1270.     TYPE_WATER, // underwater
  1271.     TYPE_WATER, // water
  1272.     TYPE_WATER, // pond water
  1273.     TYPE_ROCK, // rock
  1274.     TYPE_ROCK, // cave
  1275.     TYPE_NORMAL, // building
  1276.     TYPE_NORMAL, // plain
  1277. };
  1278.  
  1279. static const u8 sBallCatchBonuses[] =
  1280. {
  1281.     20, 15, 10, 15 // Ultra, Great, Poke, Safari
  1282. };
  1283.  
  1284. static void atk00_attackcanceler(void)
  1285. {
  1286.     s32 i;
  1287.  
  1288.     if (gBattleOutcome != 0)
  1289.     {
  1290.         gCurrentActionFuncId = ACTION_FINISHED;
  1291.         return;
  1292.     }
  1293.     if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING))
  1294.     {
  1295.         gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
  1296.         gBattlescriptCurrInstr = BattleScript_MoveEnd;
  1297.         return;
  1298.     }
  1299.     if (AtkCanceller_UnableToUseMove())
  1300.         return;
  1301.     if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBankTarget, 0, 0, 0))
  1302.         return;
  1303.     if (!gBattleMons[gBankAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200)
  1304.      && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS))
  1305.     {
  1306.         gBattlescriptCurrInstr = BattleScript_NoPPForMove;
  1307.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  1308.         return;
  1309.     }
  1310.  
  1311.     gHitMarker &= ~(HITMARKER_x800000);
  1312.  
  1313.     if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS))
  1314.     {
  1315.         i = IsMonDisobedient(); // why use the 'i' variable...?
  1316.         switch (i)
  1317.         {
  1318.         case 0:
  1319.             break;
  1320.         case 2:
  1321.             gHitMarker |= HITMARKER_OBEYS;
  1322.             return;
  1323.         default:
  1324.             gMoveResultFlags |= MOVE_RESULT_MISSED;
  1325.             return;
  1326.         }
  1327.     }
  1328.  
  1329.     gHitMarker |= HITMARKER_OBEYS;
  1330.  
  1331.     if (gProtectStructs[gBankTarget].bounceMove && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_MAGIC_COAT)
  1332.     {
  1333.         PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT);
  1334.         gProtectStructs[gBankTarget].bounceMove = 0;
  1335.         BattleScriptPushCursor();
  1336.         gBattlescriptCurrInstr = BattleScript_MagicCoatBounce;
  1337.         return;
  1338.     }
  1339.  
  1340.     for (i = 0; i < gBattlersCount; i++)
  1341.     {
  1342.         if ((gProtectStructs[gBanksByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_SNATCH)
  1343.         {
  1344.             PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH);
  1345.             gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0;
  1346.             gBattleStruct->scriptingActive = gBanksByTurnOrder[i];
  1347.             BattleScriptPushCursor();
  1348.             gBattlescriptCurrInstr = BattleScript_SnatchedMove;
  1349.             return;
  1350.         }
  1351.     }
  1352.  
  1353.     if (gSpecialStatuses[gBankTarget].lightningRodRedirected)
  1354.     {
  1355.         gSpecialStatuses[gBankTarget].lightningRodRedirected = 0;
  1356.         gLastUsedAbility = ABILITY_LIGHTNING_ROD;
  1357.         BattleScriptPushCursor();
  1358.         gBattlescriptCurrInstr = BattleScript_TookAttack;
  1359.         RecordAbilityBattle(gBankTarget, gLastUsedAbility);
  1360.     }
  1361.     else if (TARGET_PROTECT_AFFECTED
  1362.      && (gCurrentMove != MOVE_CURSE || (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST))
  1363.      && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS))))
  1364.     {
  1365.         CancelMultiTurnMoves(gBankAttacker);
  1366.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  1367.         gLastLandedMoves[gBankTarget] = 0;
  1368.         gLastHitByType[gBankTarget] = 0;
  1369.         gBattleCommunication[6] = 1;
  1370.         gBattlescriptCurrInstr++;
  1371.     }
  1372.     else
  1373.     {
  1374.         gBattlescriptCurrInstr++;
  1375.     }
  1376. }
  1377.  
  1378. static void JumpIfMoveFailed(u8 adder, u16 move)
  1379. {
  1380.     const u8 *BS_ptr = gBattlescriptCurrInstr + adder;
  1381.     if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
  1382.     {
  1383.         gLastLandedMoves[gBankTarget] = 0;
  1384.         gLastHitByType[gBankTarget] = 0;
  1385.         BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  1386.     }
  1387.     else
  1388.     {
  1389.         TrySetDestinyBondToHappen();
  1390.         if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBankTarget, 0, 0, move))
  1391.             return;
  1392.     }
  1393.     gBattlescriptCurrInstr = BS_ptr;
  1394. }
  1395.  
  1396. static void atk40_jumpifaffectedbyprotect(void)
  1397. {
  1398.     if (TARGET_PROTECT_AFFECTED)
  1399.     {
  1400.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  1401.         JumpIfMoveFailed(5, 0);
  1402.         gBattleCommunication[6] = 1;
  1403.     }
  1404.     else
  1405.     {
  1406.         gBattlescriptCurrInstr += 5;
  1407.     }
  1408. }
  1409.  
  1410. static bool8 JumpIfMoveAffectedByProtect(u16 move)
  1411. {
  1412.     bool8 affected = FALSE;
  1413.     if (TARGET_PROTECT_AFFECTED)
  1414.     {
  1415.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  1416.         JumpIfMoveFailed(7, move);
  1417.         gBattleCommunication[6] = 1;
  1418.         affected = TRUE;
  1419.     }
  1420.     return affected;
  1421. }
  1422.  
  1423. static bool8 AccuracyCalcHelper(u16 move)
  1424. {
  1425.     if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker)
  1426.     {
  1427.         JumpIfMoveFailed(7, move);
  1428.         return TRUE;
  1429.     }
  1430.  
  1431.     if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBankTarget] & STATUS3_ON_AIR)
  1432.     {
  1433.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  1434.         JumpIfMoveFailed(7, move);
  1435.         return TRUE;
  1436.     }
  1437.  
  1438.     gHitMarker &= ~HITMARKER_IGNORE_ON_AIR;
  1439.  
  1440.     if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBankTarget] & STATUS3_UNDERGROUND)
  1441.     {
  1442.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  1443.         JumpIfMoveFailed(7, move);
  1444.         return TRUE;
  1445.     }
  1446.  
  1447.     gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND;
  1448.  
  1449.     if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBankTarget] & STATUS3_UNDERWATER)
  1450.     {
  1451.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  1452.         JumpIfMoveFailed(7, move);
  1453.         return TRUE;
  1454.     }
  1455.  
  1456.     gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER;
  1457.  
  1458.     if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER)
  1459.      || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW))
  1460.     {
  1461.         JumpIfMoveFailed(7, move);
  1462.         return TRUE;
  1463.     }
  1464.  
  1465.     return FALSE;
  1466. }
  1467.  
  1468. static void atk01_accuracycheck(void)
  1469. {
  1470.     u16 move = T2_READ_16(gBattlescriptCurrInstr + 5);
  1471.  
  1472.     if (move == 0xFFFE || move == 0xFFFF)
  1473.     {
  1474.         if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker)
  1475.             gBattlescriptCurrInstr += 7;
  1476.         else if (gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
  1477.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  1478.         else if (!JumpIfMoveAffectedByProtect(0))
  1479.             gBattlescriptCurrInstr += 7;
  1480.     }
  1481.     else
  1482.     {
  1483.         u8 type, moveAcc, holdEffect, quality;
  1484.         s8 buff;
  1485.         u16 calc;
  1486.  
  1487.         if (move == 0)
  1488.             move = gCurrentMove;
  1489.  
  1490.         GET_MOVE_TYPE(move, type);
  1491.  
  1492.         if (JumpIfMoveAffectedByProtect(move))
  1493.             return;
  1494.         if (AccuracyCalcHelper(move))
  1495.             return;
  1496.  
  1497.         if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT)
  1498.         {
  1499.             u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC];
  1500.             buff = acc;
  1501.         }
  1502.         else
  1503.         {
  1504.             u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC];
  1505.             buff = acc + 6 - gBattleMons[gBankTarget].statStages[STAT_STAGE_EVASION];
  1506.         }
  1507.  
  1508.         if (buff < 0)
  1509.             buff = 0;
  1510.         if (buff > 0xC)
  1511.             buff = 0xC;
  1512.  
  1513.         moveAcc = gBattleMoves[move].accuracy;
  1514.         // check Thunder on sunny weather
  1515.         if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER)
  1516.             moveAcc = 50;
  1517.  
  1518.         calc = gAccuracyStageRatios[buff].dividend * moveAcc;
  1519.         calc /= gAccuracyStageRatios[buff].divisor;
  1520.  
  1521.         if (gBattleMons[gBankAttacker].ability == ABILITY_COMPOUND_EYES)
  1522.             calc = (calc * 130) / 100; // 1.3 compound eyes boost
  1523.         if (WEATHER_HAS_EFFECT && gBattleMons[gBankTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY)
  1524.             calc = (calc * 80) / 100; // 1.2 sand veil loss;
  1525.         if (gBattleMons[gBankAttacker].ability == ABILITY_HUSTLE && type < 9)
  1526.             calc = (calc * 80) / 100; // 1.2 hustle loss;
  1527.  
  1528.         if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
  1529.         {
  1530.             holdEffect = gEnigmaBerries[gBankTarget].holdEffect;
  1531.             quality = gEnigmaBerries[gBankTarget].holdEffectParam;
  1532.         }
  1533.         else
  1534.         {
  1535.             holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
  1536.             quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
  1537.         }
  1538.  
  1539.         gStringBank = gBankTarget;
  1540.  
  1541.         if (holdEffect == HOLD_EFFECT_EVASION_UP)
  1542.             calc = (calc * (100 - quality)) / 100;
  1543.  
  1544.         // final calculation
  1545.         if ((Random() % 100 + 1) > calc)
  1546.         {
  1547.             gMoveResultFlags |= MOVE_RESULT_MISSED;
  1548.             if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE &&
  1549.                 (gBattleMoves[move].target == 0x8 || gBattleMoves[move].target == 0x20))
  1550.                 gBattleCommunication[6] = 2;
  1551.             else
  1552.                 gBattleCommunication[6] = 0;
  1553.             CheckWonderGuardAndLevitate();
  1554.         }
  1555.         JumpIfMoveFailed(7, move);
  1556.     }
  1557. }
  1558.  
  1559. static void atk02_attackstring(void)
  1560. {
  1561.     if (gBattleExecBuffer)
  1562.          return;
  1563.     if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED)))
  1564.     {
  1565.         PrepareStringBattle(4, gBankAttacker);
  1566.         gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED;
  1567.     }
  1568.     gBattlescriptCurrInstr++;
  1569.     gBattleCommunication[MSG_DISPLAY] = 0;
  1570. }
  1571.  
  1572. static void atk03_ppreduce(void)
  1573. {
  1574.     s32 ppToDeduct = 1;
  1575.  
  1576.     if (gBattleExecBuffer)
  1577.         return;
  1578.  
  1579.     if (!gSpecialStatuses[gBankAttacker].flag20)
  1580.     {
  1581.         switch (gBattleMoves[gCurrentMove].target)
  1582.         {
  1583.         case TARGET_FOES_AND_ALLY:
  1584.             ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBankAttacker, ABILITY_PRESSURE, 0, 0);
  1585.             break;
  1586.         case TARGET_BOTH:
  1587.         case TARGET_OPPONENTS_FIELD:
  1588.             ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_PRESSURE, 0, 0);
  1589.             break;
  1590.         default:
  1591.             if (gBankAttacker != gBankTarget && gBattleMons[gBankTarget].ability == ABILITY_PRESSURE)
  1592.                 ppToDeduct++;
  1593.             break;
  1594.         }
  1595.     }
  1596.  
  1597.     if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBankAttacker].pp[gCurrMovePos])
  1598.     {
  1599.         gProtectStructs[gBankAttacker].notFirstStrike = 1;
  1600.  
  1601.         if (gBattleMons[gBankAttacker].pp[gCurrMovePos] > ppToDeduct)
  1602.             gBattleMons[gBankAttacker].pp[gCurrMovePos] -= ppToDeduct;
  1603.         else
  1604.             gBattleMons[gBankAttacker].pp[gCurrMovePos] = 0;
  1605.  
  1606.         if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED)
  1607.             && !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos]))
  1608.         {
  1609.             gActiveBattler = gBankAttacker;
  1610.             EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]);
  1611.             MarkBufferBankForExecution(gBankAttacker);
  1612.         }
  1613.     }
  1614.  
  1615.     gHitMarker &= ~(HITMARKER_NO_PPDEDUCT);
  1616.     gBattlescriptCurrInstr++;
  1617. }
  1618.  
  1619. static void atk04_critcalc(void)
  1620. {
  1621.     u8 holdEffect;
  1622.     u16 item, critChance;
  1623.  
  1624.     item = gBattleMons[gBankAttacker].item;
  1625.  
  1626.     if (item == ITEM_ENIGMA_BERRY)
  1627.         holdEffect = gEnigmaBerries[gBankAttacker].holdEffect;
  1628.     else
  1629.         holdEffect = ItemId_GetHoldEffect(item);
  1630.  
  1631.     gStringBank = gBankAttacker;
  1632.  
  1633.     critChance  = 2 * ((gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)
  1634.                 + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL)
  1635.                 + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK)
  1636.                 + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK)
  1637.                 + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL)
  1638.                 + (gBattleMoves[gCurrentMove].effect == EFFECT_RAZOR_WIND)
  1639.                 + (holdEffect == HOLD_EFFECT_SCOPE_LENS)
  1640.                 + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY)
  1641.                 + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD);
  1642.  
  1643.     if (critChance > 4)
  1644.         critChance = 4;
  1645.  
  1646.     if ((gBattleMons[gBankTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBankTarget].ability != ABILITY_SHELL_ARMOR)
  1647.      && !(gStatuses3[gBankAttacker] & STATUS3_CANT_SCORE_A_CRIT)
  1648.      && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE))
  1649.      && !(Random() % sCriticalHitChance[critChance]))
  1650.         gCritMultiplier = 2;
  1651.     else
  1652.         gCritMultiplier = 1;
  1653.  
  1654.     gBattlescriptCurrInstr++;
  1655. }
  1656.  
  1657. static void atk05_damagecalc(void)
  1658. {
  1659.     u16 side_hword = gSideAffecting[GetBattlerPosition(gBankTarget) & 1];
  1660.     gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove,
  1661.                                             side_hword, gDynamicBasePower,
  1662.                                             gBattleStruct->dynamicMoveType, gBankAttacker, gBankTarget);
  1663.     gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleStruct->dmgMultiplier;
  1664.  
  1665.     if (gStatuses3[gBankAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
  1666.         gBattleMoveDamage *= 2;
  1667.     if (gProtectStructs[gBankAttacker].helpingHand)
  1668.         gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
  1669.  
  1670.     gBattlescriptCurrInstr++;
  1671. }
  1672.  
  1673. void AI_CalcDmg(u8 BankAtk, u8 BankDef)
  1674. {
  1675.     u16 side_hword = gSideAffecting[GetBattlerPosition(BankDef) & 1];
  1676.     gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[BankAtk], &gBattleMons[BankDef], gCurrentMove,
  1677.                                             side_hword, gDynamicBasePower,
  1678.                                             gBattleStruct->dynamicMoveType, BankAtk, BankDef);
  1679.     gDynamicBasePower = 0;
  1680.     gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleStruct->dmgMultiplier;
  1681.  
  1682.     if (gStatuses3[BankAtk] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
  1683.         gBattleMoveDamage *= 2;
  1684.     if (gProtectStructs[BankAtk].helpingHand)
  1685.         gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
  1686. }
  1687.  
  1688. static void ModulateDmgByType(u8 multiplier)
  1689. {
  1690.     gBattleMoveDamage = gBattleMoveDamage * multiplier / 10;
  1691.     if (gBattleMoveDamage == 0 && multiplier != 0)
  1692.         gBattleMoveDamage = 1;
  1693.  
  1694.     switch (multiplier)
  1695.     {
  1696.     case 0: //no effect
  1697.         gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
  1698.         gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
  1699.         gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
  1700.         break;
  1701.     case 5: //not very effecting
  1702.         if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  1703.         {
  1704.             if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)
  1705.                 gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
  1706.             else
  1707.                 gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
  1708.         }
  1709.         break;
  1710.     case 20: //super effective
  1711.         if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  1712.         {
  1713.             if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
  1714.                 gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
  1715.             else
  1716.                 gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE;
  1717.         }
  1718.         break;
  1719.     }
  1720. }
  1721.  
  1722. static void atk06_typecalc(void)
  1723. {
  1724.     int i = 0;
  1725.     u8 move_type;
  1726.     u8 flags = 0;
  1727.     if (gCurrentMove != MOVE_STRUGGLE)
  1728.     {
  1729.         if (gBattleStruct->dynamicMoveType)
  1730.             move_type = gBattleStruct->dynamicMoveType & 0x3F;
  1731.         else
  1732.             move_type = gBattleMoves[gCurrentMove].type;
  1733.  
  1734.         //check stab
  1735.         if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type)
  1736.         {
  1737.             gBattleMoveDamage = gBattleMoveDamage * 15;
  1738.             gBattleMoveDamage = gBattleMoveDamage / 10;
  1739.         }
  1740.  
  1741.         // Adaptability
  1742.         if ((gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) && gBattleMons[gBankAttacker].ability == ABILITY_ADAPTABILITY)
  1743.         {
  1744.             gBattleMoveDamage = gBattleMoveDamage * 20;
  1745.             gBattleMoveDamage = gBattleMoveDamage / 10;
  1746.         }
  1747.  
  1748.         if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND)
  1749.         {
  1750.             gLastUsedAbility = gBattleMons[gBankTarget].ability;
  1751.             gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);
  1752.             gLastLandedMoves[gBankTarget] = 0;
  1753.             gLastHitByType[gBankTarget] = 0;
  1754.             gBattleCommunication[6] = move_type;
  1755.             RecordAbilityBattle(gBankTarget, gLastUsedAbility);
  1756.         }
  1757.         else
  1758.         {
  1759.             while (gTypeEffectiveness[i]!= TYPE_ENDTABLE)
  1760.             {
  1761.                 if (gTypeEffectiveness[i] == TYPE_FORESIGHT)
  1762.                 {
  1763.                     if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT)
  1764.                         break;
  1765.                     i += 3;
  1766.                     continue;
  1767.                 }
  1768.  
  1769.                 else if (gTypeEffectiveness[i] == move_type)
  1770.                 {
  1771.                     //check type1
  1772.                     if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1)
  1773.                         ModulateDmgByType(gTypeEffectiveness[i + 2]);
  1774.                     //check type2
  1775.                     if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 &&
  1776.                         gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2)
  1777.                         ModulateDmgByType(gTypeEffectiveness[i + 2]);
  1778.                 }
  1779.                 i += 3;
  1780.             }
  1781.         }
  1782.  
  1783.         if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2
  1784.          && (!(gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || ((gMoveResultFlags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))
  1785.          && gBattleMoves[gCurrentMove].power)
  1786.         {
  1787.             gLastUsedAbility = ABILITY_WONDER_GUARD;
  1788.             gMoveResultFlags |= MOVE_RESULT_MISSED;
  1789.             gLastLandedMoves[gBankTarget] = 0;
  1790.             gLastHitByType[gBankTarget] = 0;
  1791.             gBattleCommunication[6] = 3;
  1792.             RecordAbilityBattle(gBankTarget, gLastUsedAbility);
  1793.         }
  1794.         if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
  1795.             gProtectStructs[gBankAttacker].notEffective = 1;
  1796.     }
  1797.  
  1798.         // Expert Belt
  1799.         if (gBattleMons[gBankAttacker].item == ITEM_EXPERT_BELT && !(flags & MOVE_RESULT_MISSED) && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) && gBattleMoves[gCurrentMove].power)
  1800.         {
  1801.             gBattleMoveDamage = gBattleMoveDamage * 20;
  1802.             gBattleMoveDamage = gBattleMoveDamage / 15;
  1803.         }
  1804.  
  1805.         // Filter - Solid Rock
  1806.         if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE && (gBattleMons[gBankTarget].ability == ABILITY_FILTER || gBattleMons[gBankTarget].ability == ABILITY_SOLID_ROCK))
  1807.         {
  1808.             gBattleMoveDamage = gBattleMoveDamage * 15;
  1809.             gBattleMoveDamage = gBattleMoveDamage / 20;
  1810.         }
  1811.  
  1812.     gBattlescriptCurrInstr++;
  1813. }
  1814. static void CheckWonderGuardAndLevitate(void)
  1815. {
  1816.     u8 flags = 0;
  1817.     int i = 0;
  1818.     u8 move_type;
  1819.  
  1820.     if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power)
  1821.         return;
  1822.  
  1823.     if (gBattleStruct->dynamicMoveType)
  1824.         move_type = gBattleStruct->dynamicMoveType & 0x3F;
  1825.     else
  1826.         move_type = gBattleMoves[gCurrentMove].type;
  1827.  
  1828.     if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND)
  1829.     {
  1830.         RecordAbilitySetField6(ABILITY_LEVITATE, move_type);
  1831.         return;
  1832.     }
  1833.  
  1834.     while (gTypeEffectiveness[i]!= TYPE_ENDTABLE)
  1835.     {
  1836.         if (gTypeEffectiveness[i] == TYPE_FORESIGHT)
  1837.         {
  1838.             if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT)
  1839.                 break;
  1840.             i += 3;
  1841.             continue;
  1842.         }
  1843.  
  1844.         if (gTypeEffectiveness[i] == move_type)
  1845.         {
  1846.             //check no effect
  1847.             if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 0)
  1848.             {
  1849.                 gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
  1850.                 gProtectStructs[gBankAttacker].notEffective = 1;
  1851.             }
  1852.             if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 &&
  1853.                 gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 &&
  1854.                 gTypeEffectiveness[i + 2] == 0)
  1855.             {
  1856.                 gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
  1857.                 gProtectStructs[gBankAttacker].notEffective = 1;
  1858.             }
  1859.  
  1860.             //check super effective
  1861.             if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 20)
  1862.                 flags |= 1;
  1863.             if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2
  1864.              && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2
  1865.              && gTypeEffectiveness[i + 2] == 20)
  1866.                 flags |= 1;
  1867.  
  1868.             //check not very effective
  1869.             if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 5)
  1870.                 flags |= 2;
  1871.             if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2
  1872.              && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2
  1873.              && gTypeEffectiveness[i + 2] == 5)
  1874.                 flags |= 2;
  1875.         }
  1876.         i += 3;
  1877.     }
  1878.  
  1879.     if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2)
  1880.     {
  1881.         if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power)
  1882.         {
  1883.             RecordAbilitySetField6(ABILITY_WONDER_GUARD, 3);
  1884.         }
  1885.     }
  1886. }
  1887.  
  1888. static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) //a literal copy of the ModulateDmgbyType1 with different args...
  1889. {
  1890.     gBattleMoveDamage = gBattleMoveDamage * multiplier / 10;
  1891.     if (gBattleMoveDamage == 0 && multiplier != 0)
  1892.         gBattleMoveDamage = 1;
  1893.  
  1894.     switch (multiplier)
  1895.     {
  1896.     case 0: //no effect
  1897.         *flags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
  1898.         *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
  1899.         *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
  1900.         break;
  1901.     case 5: //not very effecting
  1902.         if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT))
  1903.         {
  1904.             if (*flags & MOVE_RESULT_SUPER_EFFECTIVE)
  1905.                 *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
  1906.             else
  1907.                 *flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
  1908.         }
  1909.         break;
  1910.     case 20: //super effective
  1911.         if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT))
  1912.         {
  1913.             if (*flags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
  1914.                 *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
  1915.             else
  1916.                 *flags |= MOVE_RESULT_SUPER_EFFECTIVE;
  1917.         }
  1918.         break;
  1919.     }
  1920. }
  1921.  
  1922. u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def)
  1923. {
  1924.     int i = 0;
  1925.     u8 flags = 0;
  1926.     u8 move_type;
  1927.  
  1928.     if (move == MOVE_STRUGGLE)
  1929.         return 0;
  1930.  
  1931.     move_type = gBattleMoves[move].type;
  1932.  
  1933.     //check stab
  1934.     if (gBattleMons[bank_atk].type1 == move_type || gBattleMons[bank_atk].type2 == move_type)
  1935.     {
  1936.         gBattleMoveDamage = gBattleMoveDamage * 15;
  1937.         gBattleMoveDamage = gBattleMoveDamage / 10;
  1938.     }
  1939.  
  1940.     if (gBattleMons[bank_def].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND)
  1941.     {
  1942.         flags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);
  1943.     }
  1944.     else
  1945.     {
  1946.         while (gTypeEffectiveness[i]!= TYPE_ENDTABLE)
  1947.         {
  1948.             if (gTypeEffectiveness[i] == TYPE_FORESIGHT)
  1949.             {
  1950.                 if (gBattleMons[bank_def].status2 & STATUS2_FORESIGHT)
  1951.                     break;
  1952.                 i += 3;
  1953.                 continue;
  1954.             }
  1955.  
  1956.             else if (gTypeEffectiveness[i] == move_type)
  1957.             {
  1958.                 //check type1
  1959.                 if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type1)
  1960.                     ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags);
  1961.                 //check type2
  1962.                 if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type2 &&
  1963.                     gBattleMons[gBankTarget /* what the christ */].type1 != gBattleMons[bank_def].type2)
  1964.                     ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags);
  1965.             }
  1966.             i += 3;
  1967.         }
  1968.     }
  1969.  
  1970.     if (gBattleMons[bank_def].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_MISSED) &&
  1971.         AttacksThisTurn(bank_atk, move) == 2 &&
  1972.         (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) &&
  1973.         gBattleMoves[move].power)
  1974.     {
  1975.         flags |= MOVE_RESULT_MISSED;
  1976.     }
  1977.  
  1978.     // Filter - Solid Rock
  1979.     if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE && (gBattleMons[gBankTarget].ability == ABILITY_FILTER || gBattleMons[gBankTarget].ability == ABILITY_SOLID_ROCK))
  1980.     {
  1981.         gBattleMoveDamage = gBattleMoveDamage * 15;
  1982.         gBattleMoveDamage = gBattleMoveDamage / 20;
  1983.     }
  1984.  
  1985.     return flags;
  1986. }
  1987.  
  1988. u8 AI_TypeCalc(u16 move, u16 species, u8 ability)
  1989. {
  1990.     int i = 0;
  1991.     u8 flags = 0;
  1992.     u8 type1 = gBaseStats[species].type1, type2 = gBaseStats[species].type2, move_type;
  1993.  
  1994.     if (move == MOVE_STRUGGLE)
  1995.         return 0;
  1996.  
  1997.     move_type = gBattleMoves[move].type;
  1998.  
  1999.     if (ability == ABILITY_LEVITATE && move_type == TYPE_GROUND)
  2000.         flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE;
  2001.     else
  2002.     {
  2003.         while (gTypeEffectiveness[i]!= TYPE_ENDTABLE)
  2004.         {
  2005.             if (gTypeEffectiveness[i] == TYPE_FORESIGHT)
  2006.             {
  2007.                 i += 3;
  2008.                 continue;
  2009.             }
  2010.             if (gTypeEffectiveness[i] == move_type)
  2011.             {
  2012.                 //check type1
  2013.                 if (gTypeEffectiveness[i + 1] == type1)
  2014.                     ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags);
  2015.                 //check type2
  2016.                 if (gTypeEffectiveness[i + 1] == type2 && gBattleMons[gBankTarget].type1 != type2) //gf you morons, you should check if (type1 != type2)...
  2017.                     ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags);
  2018.             }
  2019.             i += 3;
  2020.         }
  2021.     }
  2022.     if (ability == ABILITY_WONDER_GUARD
  2023.      && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))
  2024.      && gBattleMoves[move].power)
  2025.         flags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
  2026.     return flags;
  2027. }
  2028.  
  2029. // Multiplies the damage by a random factor between 85% to 100% inclusive
  2030. static inline void ApplyRandomDmgMultiplier(void)
  2031. {
  2032.     u16 rand = Random();
  2033.     u16 randPercent = 100 - (rand % 16);
  2034.  
  2035.     if (gBattleMoveDamage != 0)
  2036.     {
  2037.         gBattleMoveDamage *= randPercent;
  2038.         gBattleMoveDamage /= 100;
  2039.         if (gBattleMoveDamage == 0)
  2040.             gBattleMoveDamage = 1;
  2041.     }
  2042. }
  2043.  
  2044. void Unused_ApplyRandomDmgMultiplier(void)
  2045. {
  2046.     ApplyRandomDmgMultiplier();
  2047. }
  2048.  
  2049. static void atk07_adjustnormaldamage(void)
  2050. {
  2051.     u8 hold_effect, quality;
  2052.     ApplyRandomDmgMultiplier();
  2053.     if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
  2054.     {
  2055.         hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam;
  2056.     }
  2057.     else
  2058.     {
  2059.         hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
  2060.         quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
  2061.     }
  2062.  
  2063.     gStringBank = gBankTarget;
  2064.  
  2065.     if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality)
  2066.     {
  2067.         RecordItemBattle(gBankTarget, hold_effect);
  2068.         gSpecialStatuses[gBankTarget].focusBanded = 1;
  2069.     }
  2070.     if (hold_effect == HOLD_EFFECT_FOCUS_SASH && gBattleMons[gBankTarget].hp > 1)
  2071.     {
  2072.         RecordItemBattle(gBankTarget, hold_effect);
  2073.         gSpecialStatuses[gBankTarget].focusBanded = 1;
  2074.     }
  2075.     if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)
  2076.         goto END;
  2077.     if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured
  2078.      && !gSpecialStatuses[gBankTarget].focusBanded)
  2079.         goto END;
  2080.  
  2081.     if (gBattleMons[gBankTarget].hp > gBattleMoveDamage)
  2082.         goto END;
  2083.  
  2084.     gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1;
  2085.  
  2086.     if (gProtectStructs[gBankTarget].endured)
  2087.     {
  2088.         gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;
  2089.         goto END;
  2090.     }
  2091.     if (gSpecialStatuses[gBankTarget].focusBanded)
  2092.     {
  2093.         gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;
  2094.         gLastUsedItem = gBattleMons[gBankTarget].item;
  2095.     }
  2096.  
  2097.     END:
  2098.         gBattlescriptCurrInstr++;
  2099. }
  2100.  
  2101. static void atk08_adjustnormaldamage2(void) //literally the same as 0x7 except it doesn't check for false swipe move effect...
  2102. {
  2103.     u8 hold_effect, quality;
  2104.     ApplyRandomDmgMultiplier();
  2105.     if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
  2106.     {
  2107.         hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam;
  2108.     }
  2109.     else
  2110.     {
  2111.         hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
  2112.         quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
  2113.     }
  2114.  
  2115.     gStringBank = gBankTarget;
  2116.  
  2117.     if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality)
  2118.     {
  2119.         RecordItemBattle(gBankTarget, hold_effect);
  2120.         gSpecialStatuses[gBankTarget].focusBanded = 1;
  2121.     }
  2122.     if (hold_effect == HOLD_EFFECT_FOCUS_SASH)
  2123.     {
  2124.         RecordItemBattle(gBankTarget, hold_effect);
  2125.         gSpecialStatuses[gBankTarget].focusBanded = 1;
  2126.     }
  2127.     if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)
  2128.         goto END;
  2129.     if (!gProtectStructs[gBankTarget].endured
  2130.      && !gSpecialStatuses[gBankTarget].focusBanded)
  2131.         goto END;
  2132.  
  2133.     if (gBattleMons[gBankTarget].hp > gBattleMoveDamage)
  2134.         goto END;
  2135.  
  2136.     gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1;
  2137.  
  2138.     if (gProtectStructs[gBankTarget].endured)
  2139.     {
  2140.         gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;
  2141.         goto END;
  2142.     }
  2143.     if (gSpecialStatuses[gBankTarget].focusBanded)
  2144.     {
  2145.         gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;
  2146.         gLastUsedItem = gBattleMons[gBankTarget].item;
  2147.     }
  2148.  
  2149.     END:
  2150.         gBattlescriptCurrInstr++;
  2151. }
  2152.  
  2153. static void atk09_attackanimation(void)
  2154. {
  2155.     if (gBattleExecBuffer)
  2156.         return;
  2157.  
  2158.     if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE))
  2159.     {
  2160.         BattleScriptPush(gBattlescriptCurrInstr + 1);
  2161.         gBattlescriptCurrInstr = BattleScript_Pausex20;
  2162.         gBattleStruct->animTurn += 1;
  2163.         gBattleStruct->animTargetsHit += 1;
  2164.     }
  2165.     else
  2166.     {
  2167.         if ((gBattleMoves[gCurrentMove].target & TARGET_BOTH || gBattleMoves[gCurrentMove].target & TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & TARGET_DEPENDS) && gBattleStruct->animTargetsHit)
  2168.         {
  2169.             gBattlescriptCurrInstr++;
  2170.             return;
  2171.         }
  2172.         if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  2173.         {
  2174.             gActiveBattler = gBankAttacker;
  2175.  
  2176.             EmitMoveAnimation(0, gCurrentMove, gBattleStruct->animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBankAttacker].friendship, &gDisableStructs[gBankAttacker]);
  2177.             gBattleStruct->animTurn += 1;
  2178.             gBattleStruct->animTargetsHit += 1;
  2179.             MarkBufferBankForExecution(gBankAttacker);
  2180.             gBattlescriptCurrInstr++;
  2181.         }
  2182.         else
  2183.         {
  2184.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  2185.             gBattlescriptCurrInstr = BattleScript_Pausex20;
  2186.         }
  2187.     }
  2188. }
  2189.  
  2190. static void atk0A_waitanimation(void)
  2191. {
  2192.     if (gBattleExecBuffer == 0)
  2193.         gBattlescriptCurrInstr++;
  2194. }
  2195.  
  2196. static void atk0B_healthbarupdate(void)
  2197. {
  2198.     if (gBattleExecBuffer)
  2199.         return;
  2200.  
  2201.     if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  2202.     {
  2203.         gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]);
  2204.  
  2205.         if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))
  2206.         {
  2207.             PrepareStringBattle(0x80, gActiveBattler);
  2208.         }
  2209.         else
  2210.         {
  2211.             // Emerald
  2212.             /*
  2213.             s16 healthValue;
  2214.  
  2215.             s32 currDmg = gBattleMoveDamage;
  2216.             s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign
  2217.  
  2218.             if (currDmg <= maxPossibleDmgValue)
  2219.                 healthValue = currDmg;
  2220.             else
  2221.                 healthValue = maxPossibleDmgValue;
  2222.  
  2223.             EmitHealthBarUpdate(0, healthValue);
  2224.             */
  2225.  
  2226.             EmitHealthBarUpdate(0, gBattleMoveDamage);
  2227.             MarkBufferBankForExecution(gActiveBattler);
  2228.  
  2229.             if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0)
  2230.                 gBattleResults.unk5_0 = 1;
  2231.         }
  2232.     }
  2233.  
  2234.     gBattlescriptCurrInstr += 2;
  2235. }
  2236.  
  2237. static void atk0C_datahpupdate(void)
  2238. {
  2239.     u32 moveType;
  2240.  
  2241.     if (gBattleExecBuffer)
  2242.         return;
  2243.  
  2244.     if (gBattleStruct->dynamicMoveType == 0)
  2245.         moveType = gBattleMoves[gCurrentMove].type;
  2246.     else if (!(gBattleStruct->dynamicMoveType & 0x40))
  2247.         moveType = gBattleStruct->dynamicMoveType & 0x3F;
  2248.     else
  2249.         moveType = gBattleMoves[gCurrentMove].type;
  2250.  
  2251.     if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  2252.     {
  2253.         gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]);
  2254.         if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))
  2255.         {
  2256.             if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage)
  2257.             {
  2258.                 if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0)
  2259.                     gSpecialStatuses[gActiveBattler].moveturnLostHP = gBattleMoveDamage;
  2260.                 gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage;
  2261.                 gHpDealt = gBattleMoveDamage;
  2262.             }
  2263.             else
  2264.             {
  2265.                 if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0)
  2266.                     gSpecialStatuses[gActiveBattler].moveturnLostHP = gDisableStructs[gActiveBattler].substituteHP;
  2267.                 gHpDealt = gDisableStructs[gActiveBattler].substituteHP;
  2268.                 gDisableStructs[gActiveBattler].substituteHP = 0;
  2269.             }
  2270.             // check substitute fading
  2271.             if (gDisableStructs[gActiveBattler].substituteHP == 0)
  2272.             {
  2273.                 gBattlescriptCurrInstr += 2;
  2274.                 BattleScriptPushCursor();
  2275.                 gBattlescriptCurrInstr = BattleScript_SubstituteFade;
  2276.                 return;
  2277.             }
  2278.         }
  2279.         else
  2280.         {
  2281.             gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE);
  2282.             if (gBattleMoveDamage < 0) // hp goes up
  2283.             {
  2284.                 gBattleMons[gActiveBattler].hp -= gBattleMoveDamage;
  2285.                 if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP)
  2286.                     gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP;
  2287.  
  2288.             }
  2289.             else // hp goes down
  2290.             {
  2291.                 if (gHitMarker & HITMARKER_x20)
  2292.                 {
  2293.                     gHitMarker &= ~(HITMARKER_x20);
  2294.                 }
  2295.                 else
  2296.                 {
  2297.                     gTakenDmg[gActiveBattler] += gBattleMoveDamage;
  2298.                     if (gBattlescriptCurrInstr[1] == BS_GET_TARGET)
  2299.                         gTakenDmgBanks[gActiveBattler] = gBankAttacker;
  2300.                     else
  2301.                         gTakenDmgBanks[gActiveBattler] = gBankTarget;
  2302.                 }
  2303.  
  2304.                 if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage)
  2305.                 {
  2306.                     gBattleMons[gActiveBattler].hp -= gBattleMoveDamage;
  2307.                     gHpDealt = gBattleMoveDamage;
  2308.                 }
  2309.                 else
  2310.                 {
  2311.                     gHpDealt = gBattleMons[gActiveBattler].hp;
  2312.                     gBattleMons[gActiveBattler].hp = 0;
  2313.                 }
  2314.  
  2315.                 if (!gSpecialStatuses[gActiveBattler].moveturnLostHP && !(gHitMarker & HITMARKER_x100000))
  2316.                     gSpecialStatuses[gActiveBattler].moveturnLostHP = gHpDealt;
  2317.  
  2318.                 if (TYPE_IS_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT)
  2319.                 {
  2320.                     gProtectStructs[gActiveBattler].physicalDmg = gHpDealt;
  2321.                     gSpecialStatuses[gActiveBattler].moveturnLostHP_physical = gHpDealt;
  2322.                     if (gBattlescriptCurrInstr[1] == BS_GET_TARGET)
  2323.                     {
  2324.                         gProtectStructs[gActiveBattler].physicalBank = gBankAttacker;
  2325.                         gSpecialStatuses[gActiveBattler].moveturnPhysicalBank = gBankAttacker;
  2326.                     }
  2327.                     else
  2328.                     {
  2329.                         gProtectStructs[gActiveBattler].physicalBank = gBankTarget;
  2330.                         gSpecialStatuses[gActiveBattler].moveturnPhysicalBank = gBankTarget;
  2331.                     }
  2332.                 }
  2333.                 else if (!TYPE_IS_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000))
  2334.                 {
  2335.                     gProtectStructs[gActiveBattler].specialDmg = gHpDealt;
  2336.                     gSpecialStatuses[gActiveBattler].moveturnLostHP_special = gHpDealt;
  2337.                     if (gBattlescriptCurrInstr[1] == BS_GET_TARGET)
  2338.                     {
  2339.                         gProtectStructs[gActiveBattler].specialBank = gBankAttacker;
  2340.                         gSpecialStatuses[gActiveBattler].moveturnSpecialBank = gBankAttacker;
  2341.                     }
  2342.                     else
  2343.                     {
  2344.                         gProtectStructs[gActiveBattler].specialBank = gBankTarget;
  2345.                         gSpecialStatuses[gActiveBattler].moveturnSpecialBank = gBankTarget;
  2346.                     }
  2347.                 }
  2348.             }
  2349.             gHitMarker &= ~(HITMARKER_x100000);
  2350.             EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp);
  2351.             MarkBufferBankForExecution(gActiveBattler);
  2352.         }
  2353.     }
  2354.     else
  2355.     {
  2356.         gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]);
  2357.         if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0)
  2358.             gSpecialStatuses[gActiveBattler].moveturnLostHP = 0xFFFF;
  2359.     }
  2360.     gBattlescriptCurrInstr += 2;
  2361. }
  2362.  
  2363. static void atk0D_critmessage(void)
  2364. {
  2365.     if (gBattleExecBuffer == 0)
  2366.     {
  2367.         if (gCritMultiplier == 2 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  2368.         {
  2369.             PrepareStringBattle(0xD9, gBankAttacker);
  2370.             gBattleCommunication[MSG_DISPLAY] = 1;
  2371.         }
  2372.         gBattlescriptCurrInstr++;
  2373.     }
  2374. }
  2375.  
  2376. static void atk0E_effectivenesssound(void)
  2377. {
  2378.     if (gBattleExecBuffer)
  2379.         return;
  2380.  
  2381.     gActiveBattler = gBankTarget;
  2382.     if (!(gMoveResultFlags & MOVE_RESULT_MISSED))
  2383.     {
  2384.         u8 flag = ~MOVE_RESULT_MISSED;
  2385.         switch (gMoveResultFlags & flag)
  2386.         {
  2387.         case MOVE_RESULT_SUPER_EFFECTIVE:
  2388.             EmitEffectivenessSound(0, 14);
  2389.             MarkBufferBankForExecution(gActiveBattler);
  2390.             break;
  2391.         case MOVE_RESULT_NOT_VERY_EFFECTIVE:
  2392.             EmitEffectivenessSound(0, 12);
  2393.             MarkBufferBankForExecution(gActiveBattler);
  2394.             break;
  2395.         case MOVE_RESULT_DOESNT_AFFECT_FOE:
  2396.         case MOVE_RESULT_FAILED:
  2397.             break;
  2398.         case MOVE_RESULT_FOE_ENDURED:
  2399.         case MOVE_RESULT_ONE_HIT_KO:
  2400.         case MOVE_RESULT_FOE_HUNG_ON:
  2401.         default:
  2402.             if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)
  2403.             {
  2404.                 EmitEffectivenessSound(0, 14);
  2405.                 MarkBufferBankForExecution(gActiveBattler);
  2406.             }
  2407.             else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
  2408.             {
  2409.                 EmitEffectivenessSound(0, 12);
  2410.                 MarkBufferBankForExecution(gActiveBattler);
  2411.             }
  2412.             else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED)))
  2413.             {
  2414.                 EmitEffectivenessSound(0, 13);
  2415.                 MarkBufferBankForExecution(gActiveBattler);
  2416.             }
  2417.             break;
  2418.         }
  2419.     }
  2420.     gBattlescriptCurrInstr++;
  2421. }
  2422.  
  2423. static void atk0F_resultmessage(void)
  2424. {
  2425.     u32 stringId = 0;
  2426.  
  2427.     if (gBattleExecBuffer)
  2428.         return;
  2429.  
  2430.     if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[6] > 2))
  2431.     {
  2432.         stringId = gMissStringIds[gBattleCommunication[6]];
  2433.         gBattleCommunication[MSG_DISPLAY] = 1;
  2434.     }
  2435.     else
  2436.     {
  2437.         gBattleCommunication[MSG_DISPLAY] = 1;
  2438.         switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED)))
  2439.         {
  2440.         case MOVE_RESULT_SUPER_EFFECTIVE:
  2441.             stringId = STRINGID_SUPEREFFECTIVE;
  2442.             break;
  2443.         case MOVE_RESULT_NOT_VERY_EFFECTIVE:
  2444.             stringId = STRINGID_NOTVERYEFFECTIVE;
  2445.             break;
  2446.         case MOVE_RESULT_ONE_HIT_KO:
  2447.             stringId = STRINGID_ONEHITKO;
  2448.             break;
  2449.         case MOVE_RESULT_FOE_ENDURED:
  2450.             stringId = STRINGID_PKMNENDUREDHIT;
  2451.             break;
  2452.         case MOVE_RESULT_FAILED:
  2453.             stringId = STRINGID_BUTITFAILED;
  2454.             break;
  2455.         case MOVE_RESULT_DOESNT_AFFECT_FOE:
  2456.             stringId = STRINGID_ITDOESNTAFFECT;
  2457.             break;
  2458.         case MOVE_RESULT_FOE_HUNG_ON:
  2459.             gLastUsedItem = gBattleMons[gBankTarget].item;
  2460.             gStringBank = gBankTarget;
  2461.             gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
  2462.             BattleScriptPushCursor();
  2463.             gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
  2464.             return;
  2465.         default:
  2466.             if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
  2467.             {
  2468.                 stringId = STRINGID_ITDOESNTAFFECT;
  2469.             }
  2470.             else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO)
  2471.             {
  2472.                 gMoveResultFlags &= ~(MOVE_RESULT_ONE_HIT_KO);
  2473.                 gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE);
  2474.                 gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE);
  2475.                 BattleScriptPushCursor();
  2476.                 gBattlescriptCurrInstr = BattleScript_OneHitKOMsg;
  2477.                 return;
  2478.             }
  2479.             else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED)
  2480.             {
  2481.                 gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
  2482.                 BattleScriptPushCursor();
  2483.                 gBattlescriptCurrInstr = BattleScript_EnduredMsg;
  2484.                 return;
  2485.             }
  2486.             else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON)
  2487.             {
  2488.                 gLastUsedItem = gBattleMons[gBankTarget].item;
  2489.                 gStringBank = gBankTarget;
  2490.                 gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
  2491.                 BattleScriptPushCursor();
  2492.                 gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
  2493.                 return;
  2494.             }
  2495.             else if (gMoveResultFlags & MOVE_RESULT_FAILED)
  2496.             {
  2497.                 stringId = STRINGID_BUTITFAILED;
  2498.             }
  2499.             else
  2500.             {
  2501.                 gBattleCommunication[MSG_DISPLAY] = 0;
  2502.             }
  2503.         }
  2504.     }
  2505.  
  2506.     if (stringId)
  2507.         PrepareStringBattle(stringId, gBankAttacker);
  2508.  
  2509.     gBattlescriptCurrInstr++;
  2510. }
  2511.  
  2512. static void atk10_printstring(void)
  2513. {
  2514.     if (gBattleExecBuffer == 0)
  2515.     {
  2516.         u16 var = T2_READ_16(gBattlescriptCurrInstr + 1);
  2517.         PrepareStringBattle(var, gBankAttacker);
  2518.         gBattlescriptCurrInstr += 3;
  2519.         gBattleCommunication[MSG_DISPLAY] = 1;
  2520.     }
  2521. }
  2522.  
  2523. static void atk11_printselectionstring(void)
  2524. {
  2525.     gActiveBattler = gBankAttacker;
  2526.     EmitPrintStringPlayerOnly(0, T2_READ_16(gBattlescriptCurrInstr + 1));
  2527.     MarkBufferBankForExecution(gActiveBattler);
  2528.     gBattlescriptCurrInstr += 3;
  2529.     gBattleCommunication[MSG_DISPLAY] = 1;
  2530. }
  2531.  
  2532. static void atk12_waitmessage(void)
  2533. {
  2534.     if (gBattleExecBuffer == 0)
  2535.     {
  2536.         if (!gBattleCommunication[MSG_DISPLAY])
  2537.         {
  2538.             gBattlescriptCurrInstr += 3;
  2539.         }
  2540.         else
  2541.         {
  2542.             u16 to_wait = T2_READ_16(gBattlescriptCurrInstr + 1);
  2543.             if (++gPauseCounterBattle >= to_wait)
  2544.             {
  2545.                 gPauseCounterBattle = 0;
  2546.                 gBattlescriptCurrInstr += 3;
  2547.                 gBattleCommunication[MSG_DISPLAY] = 0;
  2548.             }
  2549.         }
  2550.     }
  2551. }
  2552.  
  2553. static void atk13_printfromtable(void)
  2554. {
  2555.     if (gBattleExecBuffer == 0)
  2556.     {
  2557.         u16 *ptr = (u16 *)T1_READ_PTR(gBattlescriptCurrInstr + 1);
  2558.         ptr += gBattleCommunication[MULTISTRING_CHOOSER];
  2559.         PrepareStringBattle(*(u16*)ptr, gBankAttacker);
  2560.         gBattlescriptCurrInstr += 5;
  2561.         gBattleCommunication[MSG_DISPLAY] = 1;
  2562.     }
  2563. }
  2564.  
  2565. static void atk14_printselectionstringfromtable(void)
  2566. {
  2567.     if (gBattleExecBuffer == 0)
  2568.     {
  2569.         u16 *ptr = (u16 *)T1_READ_PTR(gBattlescriptCurrInstr + 1); // FIXME
  2570.         ptr += gBattleCommunication[MULTISTRING_CHOOSER];
  2571.         gActiveBattler = gBankAttacker;
  2572.         EmitPrintStringPlayerOnly(0, *(u16*)ptr);
  2573.         MarkBufferBankForExecution(gActiveBattler);
  2574.         gBattlescriptCurrInstr += 5;
  2575.         gBattleCommunication[MSG_DISPLAY] = 1;
  2576.     }
  2577. }
  2578.  
  2579. u8 BankGetTurnOrder(u8 bank)
  2580. {
  2581.     int i;
  2582.     for (i = 0; i < gBattlersCount; i++)
  2583.     {
  2584.         if (gBanksByTurnOrder[i] == bank)
  2585.             break;
  2586.     }
  2587.     return i;
  2588. }
  2589.  
  2590. //Someone please decompile this monstrosity below...
  2591. #ifdef NONMATCHING
  2592. void SetMoveEffect(bool8 primary, u8 certainArg)
  2593. {
  2594.     #define EffectAffectsUser 0x40
  2595.     register u8 certain asm("r5") = certainArg;
  2596.     register bool32 StatusChanged asm("r10") = 0;
  2597.     register int AffectsUser asm("r6") = 0; //0x40 otherwise
  2598.     bool32 NoSunCanFreeze = 1;
  2599.  
  2600.     if (gBattleCommunication[MOVE_EFFECT_BYTE] & EffectAffectsUser)
  2601.     {
  2602.         gEffectBank = gBankAttacker; //bank that effects get applied on
  2603.         gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(EffectAffectsUser);
  2604.         AffectsUser = EffectAffectsUser;
  2605.         gBattleStruct->scriptingActive = gBankTarget; //theoretically the attacker
  2606.     }
  2607.     else
  2608.     {
  2609.         gEffectBank = gBankTarget;
  2610.         gBattleStruct->scriptingActive = gBankAttacker;
  2611.     }
  2612.  
  2613.     if (gBattleMons[gEffectBank].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) &&
  2614.         !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9)
  2615.         {gBattlescriptCurrInstr++; return;}
  2616.  
  2617.     if (gSideAffecting[GetBattlerPosition(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) &&
  2618.         !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7)
  2619.         {gBattlescriptCurrInstr++; return;}
  2620.  
  2621.     //make sure at least ONE HP except payday and thief
  2622.     if (gBattleMons[gEffectBank].hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F)
  2623.         {gBattlescriptCurrInstr++; return;}
  2624.  
  2625.     if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && AffectsUser != EffectAffectsUser)
  2626.         {gBattlescriptCurrInstr++; return;}
  2627.  
  2628.     if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) //status change
  2629.     {
  2630.         switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])
  2631.         {
  2632.         case STATUS_SLEEP:
  2633.             //check active uproar
  2634.             if (gBattleMons[gEffectBank].ability != ABILITY_SOUNDPROOF)
  2635.             {
  2636.                 for (gActiveBattler = 0; gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR); gActiveBattler++) {}
  2637.             }
  2638.             else
  2639.                 gActiveBattler = gBattlersCount;
  2640.             if (gBattleMons[gEffectBank].status1) {break;}
  2641.             if (gActiveBattler != gBattlersCount) {break;} //nice way of checking uproar...
  2642.             if (gBattleMons[gEffectBank].ability == ABILITY_VITAL_SPIRIT) {break;}
  2643.             if (gBattleMons[gEffectBank].ability == ABILITY_INSOMNIA) {break;}
  2644.  
  2645.             CancelMultiTurnMoves(gEffectBank);
  2646.             StatusChanged = 1;
  2647.             break;
  2648.         case STATUS_POISON:
  2649.             if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80))
  2650.             {
  2651.                 gLastUsedAbility = ABILITY_IMMUNITY;
  2652.                 RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY);
  2653.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2654.             //_0801E664:
  2655.                 gBattlescriptCurrInstr = BattleScript_PSNPrevention;
  2656.                 if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
  2657.                 {
  2658.                     gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  2659.                     gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD);
  2660.                     return;
  2661.                 }
  2662.                 else
  2663.                     {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;}
  2664.             }
  2665.             if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL)
  2666.                 && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80))
  2667.             {
  2668.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2669.                 gBattlescriptCurrInstr = BattleScript_PSNPrevention;
  2670.                 gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  2671.                 return;
  2672.             }
  2673.             if (gBattleMons[gEffectBank].type1 == TYPE_POISON) {break;}
  2674.             if (gBattleMons[gEffectBank].type2 == TYPE_POISON) {break;}
  2675.             if (gBattleMons[gEffectBank].type1 == TYPE_STEEL) {break;}
  2676.             if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;}
  2677.             if (gBattleMons[gEffectBank].status1) {break;}
  2678.             if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;}
  2679.  
  2680.             StatusChanged = 1;
  2681.             break;
  2682.         case STATUS_BURN:
  2683.             if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80))
  2684.             {
  2685.                 gLastUsedAbility = ABILITY_WATER_VEIL;
  2686.                 RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL);
  2687.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2688.             //_0801E664:
  2689.                 gBattlescriptCurrInstr = BattleScript_BRNPrevention;
  2690.                 if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
  2691.                 {
  2692.                     gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  2693.                     gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD);
  2694.                     return;
  2695.                 }
  2696.                 else
  2697.                     {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;}
  2698.             }
  2699.             if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE)
  2700.                 && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80))
  2701.             {
  2702.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2703.                 gBattlescriptCurrInstr = BattleScript_BRNPrevention;
  2704.                 gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  2705.                 return;
  2706.             }
  2707.             if (gBattleMons[gEffectBank].type1 == TYPE_FIRE) {break;}
  2708.             if (gBattleMons[gEffectBank].type2 == TYPE_FIRE) {break;}
  2709.             if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL) {break;}
  2710.             if (gBattleMons[gEffectBank].status1 == 0) {break;}
  2711.             StatusChanged = 1;
  2712.             break;
  2713.         case STATUS_FREEZE:
  2714.             if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) {NoSunCanFreeze = 0;}
  2715.             if (gBattleMons[gEffectBank].type1 == TYPE_ICE) {break;}
  2716.             if (gBattleMons[gEffectBank].type2 == TYPE_ICE) {break;}
  2717.             if (gBattleMons[gEffectBank].status1) {break;}
  2718.             if (NoSunCanFreeze == 0) {break;}
  2719.             if (gBattleMons[gEffectBank].ability == ABILITY_MAGMA_ARMOR) {break;}
  2720.  
  2721.             CancelMultiTurnMoves(gEffectBank);
  2722.             StatusChanged = 1;
  2723.             break;
  2724.         case STATUS_PARALYSIS:
  2725.             if (gBattleMons[gEffectBank].ability == ABILITY_LIMBER)
  2726.             {
  2727.                 if ((primary == 1 || certain == 0x80))
  2728.                 {
  2729.                     gLastUsedAbility = ABILITY_LIMBER;
  2730.                     RecordAbilityBattle(gEffectBank, ABILITY_LIMBER);
  2731.                     BattleScriptPush(gBattlescriptCurrInstr + 1);
  2732.                 //_0801E664:
  2733.                     gBattlescriptCurrInstr = BattleScript_PRLZPrevention;
  2734.                     if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
  2735.                     {
  2736.                         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  2737.                         gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD);
  2738.                         return;
  2739.                     }
  2740.                     else
  2741.                         {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;}
  2742.                 }
  2743.                 else {break;}
  2744.             }
  2745.             if (gBattleMons[gEffectBank].status1) {break;}
  2746.             StatusChanged = 1;
  2747.             break;
  2748.         case STATUS_TOXIC_POISON:
  2749.             if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80))
  2750.             {
  2751.                 gLastUsedAbility = ABILITY_IMMUNITY;
  2752.                 RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY);
  2753.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2754.             //_0801E664:
  2755.                 gBattlescriptCurrInstr = BattleScript_PSNPrevention;
  2756.                 if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
  2757.                 {
  2758.                     gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  2759.                     gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD);
  2760.                     return;
  2761.                 }
  2762.                 else
  2763.                     {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;}
  2764.             }
  2765.             if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL)
  2766.                 && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80))
  2767.             {
  2768.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2769.                 gBattlescriptCurrInstr = BattleScript_PSNPrevention;
  2770.                 gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  2771.                 return;
  2772.             }
  2773.             if (gBattleMons[gEffectBank].status1) {break;}
  2774.             if (gBattleMons[gEffectBank].type1 != TYPE_POISON &&
  2775.                 gBattleMons[gEffectBank].type2 != TYPE_POISON &&
  2776.                 gBattleMons[gEffectBank].type1 != TYPE_STEEL &&
  2777.                 gBattleMons[gEffectBank].type2 != TYPE_STEEL)
  2778.             {
  2779.                 if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;}
  2780.                 gBattleMons[gEffectBank].status1 &= ~(0x9); //This gets (correctly) optimized out...
  2781.                 StatusChanged = 1;
  2782.                 break;
  2783.             }
  2784.             else
  2785.                 gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
  2786.             break;
  2787.         }
  2788.         if (StatusChanged == 1)
  2789.         {
  2790.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  2791.             if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP)
  2792.                 gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2);
  2793.             else
  2794.                 gBattleMons[gEffectBank].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];
  2795.             gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
  2796.             gActiveBattler = gEffectBank;
  2797.             EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1);
  2798.             MarkBufferBankForExecution(gActiveBattler);
  2799.             if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
  2800.             {
  2801.                 gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  2802.                 gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD);
  2803.             }
  2804.             else
  2805.                 gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  2806.             if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3)
  2807.             {
  2808.                 gBattleStruct->synchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE];
  2809.                 gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT;
  2810.             }
  2811.             return;
  2812.         }
  2813.         else if (StatusChanged == 0)
  2814.             {gBattlescriptCurrInstr++; return;}
  2815.     }
  2816.     else
  2817.     {
  2818.         if (gBattleMons[gEffectBank].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])
  2819.         {
  2820.             gBattlescriptCurrInstr++;
  2821.             return;
  2822.         }
  2823.         switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])
  2824.         {
  2825.         case 7: //confusion
  2826.             if (gBattleMons[gEffectBank].ability == ABILITY_OWN_TEMPO)
  2827.                 {gBattlescriptCurrInstr++; return;}
  2828.             if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION)
  2829.                 {gBattlescriptCurrInstr++; return;}
  2830.             gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2;
  2831.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  2832.             gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
  2833.             break;
  2834.         case 8: //flinch
  2835.             if (gBattleMons[gEffectBank].ability == ABILITY_INNER_FOCUS)
  2836.             {
  2837.                 if (primary == 1 || certain == 0x80)
  2838.                 {
  2839.                     gLastUsedAbility = ABILITY_INNER_FOCUS;
  2840.                     RecordAbilityBattle(gEffectBank, ABILITY_INNER_FOCUS);
  2841.                     gBattlescriptCurrInstr = BattleScript_FlinchPrevention;
  2842.                     return;
  2843.                 }
  2844.                 else
  2845.                     {gBattlescriptCurrInstr++; return;}
  2846.             }
  2847.             else
  2848.             {
  2849.                 if (BankGetTurnOrder(gEffectBank) > gCurrentTurnActionNumber)
  2850.                     gBattleMons[gEffectBank].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];
  2851.                 gBattlescriptCurrInstr++; return;
  2852.             }
  2853.             break;
  2854.         case 10: //uproar
  2855.             if (gBattleMons[gEffectBank].status2 & STATUS2_UPROAR)
  2856.                 {gBattlescriptCurrInstr++; return;}
  2857.             gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
  2858.             gLockedMoves[gEffectBank] = gCurrentMove;
  2859.             gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4;
  2860.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  2861.             gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
  2862.             break;
  2863.         case 11: //pay day
  2864.             if (!(GetBattlerPosition(gBankAttacker) & 1))
  2865.             {
  2866.                 u16 PayDay = gPaydayMoney;
  2867.                 gPaydayMoney += (gBattleMons[gBankAttacker].level * 5);
  2868.                 if (PayDay > gPaydayMoney)
  2869.                     gPaydayMoney = 0xFFFF;
  2870.             }
  2871.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  2872.             gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
  2873.             break;
  2874.         case 9: //tri attack
  2875.             if (gBattleMons[gEffectBank].status1)
  2876.                 {gBattlescriptCurrInstr++; return;}
  2877.             gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3;
  2878.             SetMoveEffect(0, 0);
  2879.             break;
  2880.         case 12: //charging move
  2881.             gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
  2882.             gLockedMoves[gEffectBank] = gCurrentMove;
  2883.             gProtectStructs[gEffectBank].chargingTurn = 1;
  2884.             gBattlescriptCurrInstr++;
  2885.             break;
  2886.         case 13: //wrap
  2887.             if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED)
  2888.                 {gBattlescriptCurrInstr++; return;}
  2889.             gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD;
  2890.             gBattleStruct->wrappedMove[gEffectBank*2] = (u8)gCurrentMove;
  2891.             (1 + gBattleStruct->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask.
  2892.             gBattleStruct->wrappedBy[gEffectBank] = gBankAttacker;
  2893.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  2894.             gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
  2895.             gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  2896.             while (gBattleCommunication[MULTISTRING_CHOOSER] <= 4
  2897.              && gCurrentMove != gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]])
  2898.                 gBattleCommunication[MULTISTRING_CHOOSER]++;
  2899.             break;
  2900.         case 14: //25% recoil
  2901.             gBattleMoveDamage = (gHpDealt) / 4;
  2902.             if (gBattleMoveDamage == 0)
  2903.                 gBattleMoveDamage = 1;
  2904.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  2905.             gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
  2906.             break;
  2907.         case 15 ... 21: //stat + 1
  2908.             if (ChangeStatBuffs(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;}
  2909.             else
  2910.             {
  2911.                 gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one
  2912.                 gBattleStruct->animArg2 = 0;
  2913.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2914.                 gBattlescriptCurrInstr = BattleScript_StatUp;
  2915.             }
  2916.             break;
  2917.         case 22 ... 28: //stat - 1
  2918.             if (ChangeStatBuffs(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly
  2919.             else
  2920.             {
  2921.                 gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F;
  2922.                 gBattleStruct->animArg2 = 0;
  2923.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2924.                 gBattlescriptCurrInstr = BattleScript_StatDown;
  2925.             }
  2926.             break;
  2927.         case 39 ... 45: //stat + 2
  2928.             if (ChangeStatBuffs(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;}
  2929.             else
  2930.             {
  2931.                 gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F;
  2932.                 gBattleStruct->animArg2 = 0;
  2933.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2934.                 gBattlescriptCurrInstr = BattleScript_StatUp;
  2935.             }
  2936.             break;
  2937.         case 46 ... 52: //stat - 2
  2938.             if (ChangeStatBuffs(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;}
  2939.             else
  2940.             {
  2941.                 gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F;
  2942.                 gBattleStruct->animArg2 = 0;
  2943.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2944.                 gBattlescriptCurrInstr = BattleScript_StatDown;
  2945.             }
  2946.             break;
  2947.         case 29: //recharge
  2948.             gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE;
  2949.             gDisableStructs[gEffectBank].rechargeCounter = 2;
  2950.             gLockedMoves[gEffectBank] = gCurrentMove;
  2951.             gBattlescriptCurrInstr++;
  2952.             break;
  2953.         case 30: //rage
  2954.             gBattleMons[gBankAttacker].status2 |= STATUS2_RAGE;
  2955.             gBattlescriptCurrInstr++;
  2956.             break;
  2957.         case 31: //item steal
  2958.             {
  2959.                 u8 side = GetBattlerSide(gBankAttacker);
  2960.                 if (GetBattlerSide(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400)
  2961.                         {gBattlescriptCurrInstr++; return;}
  2962.                 if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.knockedOffPokes[side] & gBitTable[gBattlerPartyIndexes[gBankAttacker]]))
  2963.                         {gBattlescriptCurrInstr++; return;}
  2964.                 if (gBattleMons[gBankTarget].item && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD)
  2965.                 {
  2966.                     BattleScriptPushCursor();
  2967.                     gBattlescriptCurrInstr = BattleScript_NoItemSteal;
  2968.                     gLastUsedAbility = gBattleMons[gBankTarget].ability;
  2969.                     RecordAbilityBattle(gBankTarget, gLastUsedAbility);
  2970.                     return;
  2971.                 }
  2972.                 if (gBattleMons[gBankAttacker].item)
  2973.                     {gBattlescriptCurrInstr++; return;}
  2974.                 if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
  2975.                     {gBattlescriptCurrInstr++; return;}
  2976.                 if (gBattleMons[gBankTarget].item == 0)
  2977.                     {gBattlescriptCurrInstr++; return;}
  2978.  
  2979.                 gLastUsedItem = gBattleMons[gBankTarget].item;
  2980.                 USED_HELD_ITEM(bank) = gLastUsedItem;
  2981.                 gBattleMons[gBankTarget].item = 0;
  2982.  
  2983.                 gActiveBattler = gBankAttacker;
  2984.                 EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem);
  2985.                 MarkBufferBankForExecution(gBankAttacker);
  2986.  
  2987.                 gActiveBattler = gBankTarget;
  2988.                 EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item);
  2989.                 MarkBufferBankForExecution(gBankTarget);
  2990.  
  2991.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  2992.                 gBattlescriptCurrInstr = BattleScript_ItemSteal;
  2993.  
  2994.                 CHOICED_MOVE(gBankTarget) = 0;
  2995.             }
  2996.             break;
  2997.         case 32: //escape prevention
  2998.             gBattleMons[gBankTarget].status2 |= STATUS2_RECHARGE;
  2999.             gDisableStructs[gBankTarget].bankPreventingEscape = gBankAttacker;
  3000.             gBattlescriptCurrInstr++;
  3001.             break;
  3002.         case 33: //nightmare
  3003.             gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE;
  3004.             gBattlescriptCurrInstr++;
  3005.             break;
  3006.         case 34: //ancientpower
  3007.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  3008.             gBattlescriptCurrInstr = BattleScript_AllStatsUp;
  3009.             return;
  3010.         case 35: //break free rapidspin
  3011.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  3012.             gBattlescriptCurrInstr = BattleScript_RapidSpinAway;
  3013.             return;
  3014.         case 36: //paralysis removal
  3015.             if (gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS)
  3016.             {
  3017.                 gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS);
  3018.                 gActiveBattler = gBankTarget;
  3019.                 EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1);
  3020.                 MarkBufferBankForExecution(gActiveBattler);
  3021.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  3022.                 gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal;
  3023.             }
  3024.             else
  3025.                 {gBattlescriptCurrInstr++; return;}
  3026.             break;
  3027.         case 37: //superpower
  3028.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  3029.             gBattlescriptCurrInstr = BattleScript_AtkDefDown;
  3030.             return;
  3031.         case 38: //33% recoil
  3032.             gBattleMoveDamage = gHpDealt / 3;
  3033.             if (gBattleMoveDamage == 0)
  3034.                 gBattleMoveDamage = 1;
  3035.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  3036.             gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
  3037.             break;
  3038.         case 53: //thrash
  3039.             if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE))
  3040.             {
  3041.                 gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
  3042.                 gLockedMoves[gEffectBank] = gCurrentMove;
  3043.                 gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA);
  3044.             }
  3045.             else
  3046.                 {gBattlescriptCurrInstr++; return;}
  3047.             break;
  3048.         case 54: //knock off
  3049.             if (gBattleMons[gEffectBank].ability == ABILITY_STICKY_HOLD)
  3050.             {
  3051.                 if (gBattleMons[gEffectBank].item == 0)
  3052.                     {gBattlescriptCurrInstr++; return;}
  3053.                 gLastUsedAbility = ABILITY_STICKY_HOLD;
  3054.                 gBattlescriptCurrInstr = BattleScript_NoItemSteal;
  3055.                 RecordAbilityBattle(gEffectBank, ABILITY_STICKY_HOLD);
  3056.                 return;
  3057.             }
  3058.             if (gBattleMons[gEffectBank].item == 0)
  3059.                     {gBattlescriptCurrInstr++; return;}
  3060.             else
  3061.             {
  3062.                 u8 side = GetBattlerSide(gEffectBank);
  3063.                 gLastUsedItem = gBattleMons[gEffectBank].item;
  3064.                 gBattleMons[gEffectBank].item = 0;
  3065.                 gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlerPartyIndexes[gEffectBank]];
  3066.                 BattleScriptPush(gBattlescriptCurrInstr + 1);
  3067.                 gBattlescriptCurrInstr = BattleScript_KnockedOff;
  3068.  
  3069.                 CHOICED_MOVE(gEffectBank) = 0;
  3070.             }
  3071.             break;
  3072.         case 59: //overheat
  3073.             BattleScriptPush(gBattlescriptCurrInstr + 1);
  3074.             gBattlescriptCurrInstr = BattleScript_SAtkDown2;
  3075.             return;
  3076.         }
  3077.     }
  3078. }
  3079. #else
  3080. NAKED
  3081. void SetMoveEffect(bool8 primary, u8 certainArg)
  3082. {
  3083.     asm(".syntax unified\n\
  3084.            push {r4-r7,lr}\n\
  3085.    mov r7, r10\n\
  3086.    mov r6, r9\n\
  3087.    mov r5, r8\n\
  3088.    push {r5-r7}\n\
  3089.    sub sp, 0x8\n\
  3090.    lsls r0, 24\n\
  3091.    lsrs r4, r0, 24\n\
  3092.    lsls r1, 24\n\
  3093.    lsrs r5, r1, 24\n\
  3094.    movs r0, 0\n\
  3095.    mov r10, r0\n\
  3096.    movs r6, 0\n\
  3097.    movs r1, 0x1\n\
  3098.    str r1, [sp, 0x4]\n\
  3099.    ldr r1, _0801E430 @ =gBattleCommunication\n\
  3100.    ldrb r3, [r1, 0x3]\n\
  3101.    movs r0, 0x40\n\
  3102.    ands r0, r3\n\
  3103.    adds r7, r1, 0\n\
  3104.    cmp r0, 0\n\
  3105.    beq _0801E444\n\
  3106.    ldr r2, _0801E434 @ =gEffectBank\n\
  3107.    ldr r0, _0801E438 @ =gBankAttacker\n\
  3108.    ldrb r0, [r0]\n\
  3109.    strb r0, [r2]\n\
  3110.    movs r0, 0xBF\n\
  3111.    ands r0, r3\n\
  3112.    strb r0, [r7, 0x3]\n\
  3113.    movs r6, 0x40\n\
  3114.    ldr r0, _0801E43C @ =gSharedMem\n\
  3115.    ldr r1, _0801E440 @ =gBankTarget\n\
  3116.    b _0801E450\n\
  3117.    .align 2, 0\n\
  3118. _0801E430: .4byte gBattleCommunication\n\
  3119. _0801E434: .4byte gEffectBank\n\
  3120. _0801E438: .4byte gBankAttacker\n\
  3121. _0801E43C: .4byte gSharedMem\n\
  3122. _0801E440: .4byte gBankTarget\n\
  3123. _0801E444:\n\
  3124.    ldr r2, _0801E538 @ =gEffectBank\n\
  3125.    ldr r0, _0801E53C @ =gBankTarget\n\
  3126.    ldrb r0, [r0]\n\
  3127.    strb r0, [r2]\n\
  3128.    ldr r0, _0801E540 @ =gSharedMem\n\
  3129.    ldr r1, _0801E544 @ =gBankAttacker\n\
  3130. _0801E450:\n\
  3131.    ldrb r1, [r1]\n\
  3132.    ldr r3, _0801E548 @ =0x00016003\n\
  3133.    adds r0, r3\n\
  3134.    strb r1, [r0]\n\
  3135.    mov r8, r2\n\
  3136.    ldr r2, _0801E54C @ =gBattleMons\n\
  3137.    mov r0, r8\n\
  3138.    ldrb r1, [r0]\n\
  3139.    movs r0, 0x58\n\
  3140.    muls r0, r1\n\
  3141.    adds r0, r2\n\
  3142.    adds r0, 0x20\n\
  3143.    ldrb r0, [r0]\n\
  3144.    cmp r0, 0x13\n\
  3145.    bne _0801E48A\n\
  3146.    ldr r0, _0801E550 @ =gHitMarker\n\
  3147.    ldr r0, [r0]\n\
  3148.    movs r1, 0x80\n\
  3149.    lsls r1, 6\n\
  3150.    ands r0, r1\n\
  3151.    cmp r0, 0\n\
  3152.    bne _0801E48A\n\
  3153.    cmp r4, 0\n\
  3154.    bne _0801E48A\n\
  3155.    ldrb r0, [r7, 0x3]\n\
  3156.    cmp r0, 0x9\n\
  3157.    bhi _0801E48A\n\
  3158.    bl _0801F5DC\n\
  3159. _0801E48A:\n\
  3160.    mov r1, r8\n\
  3161.    ldrb r0, [r1]\n\
  3162.    bl GetBattlerPosition\n\
  3163.    ldr r2, _0801E554 @ =gSideAffecting\n\
  3164.    movs r1, 0x1\n\
  3165.    ands r1, r0\n\
  3166.    lsls r1, 1\n\
  3167.    adds r1, r2\n\
  3168.    ldrh r1, [r1]\n\
  3169.    movs r0, 0x20\n\
  3170.    ands r0, r1\n\
  3171.    cmp r0, 0\n\
  3172.    beq _0801E4C4\n\
  3173.    ldr r0, _0801E550 @ =gHitMarker\n\
  3174.    ldr r0, [r0]\n\
  3175.    movs r1, 0x80\n\
  3176.    lsls r1, 6\n\
  3177.    ands r0, r1\n\
  3178.    cmp r0, 0\n\
  3179.    bne _0801E4C4\n\
  3180.    cmp r4, 0\n\
  3181.    bne _0801E4C4\n\
  3182.    ldr r0, _0801E558 @ =gBattleCommunication\n\
  3183.    ldrb r0, [r0, 0x3]\n\
  3184.    cmp r0, 0x7\n\
  3185.    bhi _0801E4C4\n\
  3186.    bl _0801F5DC\n\
  3187. _0801E4C4:\n\
  3188.    ldr r3, _0801E54C @ =gBattleMons\n\
  3189.    ldr r2, _0801E538 @ =gEffectBank\n\
  3190.    ldrb r1, [r2]\n\
  3191.    movs r0, 0x58\n\
  3192.    muls r0, r1\n\
  3193.    adds r0, r3\n\
  3194.    ldrh r0, [r0, 0x28]\n\
  3195.    mov r8, r2\n\
  3196.    mov r9, r3\n\
  3197.    cmp r0, 0\n\
  3198.    bne _0801E4EA\n\
  3199.    ldr r0, _0801E558 @ =gBattleCommunication\n\
  3200.    ldrb r0, [r0, 0x3]\n\
  3201.    cmp r0, 0xB\n\
  3202.    beq _0801E4EA\n\
  3203.    cmp r0, 0x1F\n\
  3204.    beq _0801E4EA\n\
  3205.    bl _0801F5DC\n\
  3206. _0801E4EA:\n\
  3207.    mov r2, r8\n\
  3208.    ldrb r1, [r2]\n\
  3209.    movs r0, 0x58\n\
  3210.    muls r0, r1\n\
  3211.    mov r1, r9\n\
  3212.    adds r1, 0x50\n\
  3213.    adds r0, r1\n\
  3214.    ldr r0, [r0]\n\
  3215.    movs r1, 0x80\n\
  3216.    lsls r1, 17\n\
  3217.    ands r0, r1\n\
  3218.    cmp r0, 0\n\
  3219.    beq _0801E50C\n\
  3220.    cmp r6, 0x40\n\
  3221.    beq _0801E50C\n\
  3222.    bl _0801F5DC\n\
  3223. _0801E50C:\n\
  3224.    ldr r0, _0801E558 @ =gBattleCommunication\n\
  3225.    ldrb r1, [r0, 0x3]\n\
  3226.    adds r7, r0, 0\n\
  3227.    cmp r1, 0x6\n\
  3228.    bls _0801E518\n\
  3229.    b _0801EB4A\n\
  3230. _0801E518:\n\
  3231.    ldr r1, _0801E55C @ =sStatusFlagsForMoveEffects\n\
  3232.    ldrb r0, [r7, 0x3]\n\
  3233.    lsls r0, 2\n\
  3234.    adds r0, r1\n\
  3235.    ldr r0, [r0]\n\
  3236.    cmp r0, 0x10\n\
  3237.    bne _0801E528\n\
  3238.    b _0801E714\n\
  3239. _0801E528:\n\
  3240.    cmp r0, 0x10\n\
  3241.    bhi _0801E560\n\
  3242.    cmp r0, 0x7\n\
  3243.    beq _0801E57A\n\
  3244.    cmp r0, 0x8\n\
  3245.    bne _0801E536\n\
  3246.    b _0801E630\n\
  3247. _0801E536:\n\
  3248.    b _0801EA14\n\
  3249.    .align 2, 0\n\
  3250. _0801E538: .4byte gEffectBank\n\
  3251. _0801E53C: .4byte gBankTarget\n\
  3252. _0801E540: .4byte gSharedMem\n\
  3253. _0801E544: .4byte gBankAttacker\n\
  3254. _0801E548: .4byte 0x00016003\n\
  3255. _0801E54C: .4byte gBattleMons\n\
  3256. _0801E550: .4byte gHitMarker\n\
  3257. _0801E554: .4byte gSideAffecting\n\
  3258. _0801E558: .4byte gBattleCommunication\n\
  3259. _0801E55C: .4byte sStatusFlagsForMoveEffects\n\
  3260. _0801E560:\n\
  3261.    cmp r0, 0x40\n\
  3262.    bne _0801E566\n\
  3263.    b _0801E888\n\
  3264. _0801E566:\n\
  3265.    cmp r0, 0x40\n\
  3266.    bhi _0801E572\n\
  3267.    cmp r0, 0x20\n\
  3268.    bne _0801E570\n\
  3269.    b _0801E7EA\n\
  3270. _0801E570:\n\
  3271.    b _0801EA14\n\
  3272. _0801E572:\n\
  3273.    cmp r0, 0x80\n\
  3274.    bne _0801E578\n\
  3275.    b _0801E8E4\n\
  3276. _0801E578:\n\
  3277.    b _0801EA14\n\
  3278. _0801E57A:\n\
  3279.    mov r3, r8\n\
  3280.    ldrb r1, [r3]\n\
  3281.    movs r0, 0x58\n\
  3282.    muls r0, r1\n\
  3283.    add r0, r9\n\
  3284.    adds r0, 0x20\n\
  3285.    ldrb r0, [r0]\n\
  3286.    cmp r0, 0x2B\n\
  3287.    beq _0801E5DC\n\
  3288.    ldr r0, _0801E5D4 @ =gActiveBattler\n\
  3289.    movs r1, 0\n\
  3290.    strb r1, [r0]\n\
  3291.    ldr r1, _0801E5D8 @ =gBattlersCount\n\
  3292.    ldrb r3, [r1]\n\
  3293.    adds r7, r0, 0\n\
  3294.    mov r12, r1\n\
  3295.    cmp r3, 0\n\
  3296.    beq _0801E5E8\n\
  3297.    mov r4, r9\n\
  3298.    ldr r0, [r4, 0x50]\n\
  3299.    movs r1, 0x70\n\
  3300.    ands r0, r1\n\
  3301.    cmp r0, 0\n\
  3302.    bne _0801E5E8\n\
  3303.    adds r1, r7, 0\n\
  3304.    mov r6, r9\n\
  3305.    adds r6, 0x50\n\
  3306.    movs r5, 0x58\n\
  3307.    movs r4, 0x70\n\
  3308. _0801E5B4:\n\
  3309.    ldrb r0, [r1]\n\
  3310.    adds r0, 0x1\n\
  3311.    strb r0, [r1]\n\
  3312.    lsls r0, 24\n\
  3313.    lsrs r0, 24\n\
  3314.    cmp r0, r3\n\
  3315.    bcs _0801E5E8\n\
  3316.    ldrb r0, [r7]\n\
  3317.    muls r0, r5\n\
  3318.    adds r0, r6\n\
  3319.    ldr r0, [r0]\n\
  3320.    ands r0, r4\n\
  3321.    cmp r0, 0\n\
  3322.    beq _0801E5B4\n\
  3323.    b _0801E5E8\n\
  3324.    .align 2, 0\n\
  3325. _0801E5D4: .4byte gActiveBattler\n\
  3326. _0801E5D8: .4byte gBattlersCount\n\
  3327. _0801E5DC:\n\
  3328.    ldr r0, _0801E628 @ =gActiveBattler\n\
  3329.    ldr r2, _0801E62C @ =gBattlersCount\n\
  3330.    ldrb r1, [r2]\n\
  3331.    strb r1, [r0]\n\
  3332.    adds r7, r0, 0\n\
  3333.    mov r12, r2\n\
  3334. _0801E5E8:\n\
  3335.    mov r0, r8\n\
  3336.    ldrb r2, [r0]\n\
  3337.    movs r0, 0x58\n\
  3338.    adds r1, r2, 0\n\
  3339.    muls r1, r0\n\
  3340.    mov r0, r9\n\
  3341.    adds r0, 0x4C\n\
  3342.    adds r0, r1, r0\n\
  3343.    ldr r0, [r0]\n\
  3344.    cmp r0, 0\n\
  3345.    beq _0801E600\n\
  3346.    b _0801EA14\n\
  3347. _0801E600:\n\
  3348.    ldrb r0, [r7]\n\
  3349.    mov r3, r12\n\
  3350.    ldrb r3, [r3]\n\
  3351.    cmp r0, r3\n\
  3352.    beq _0801E60C\n\
  3353.    b _0801EA14\n\
  3354. _0801E60C:\n\
  3355.    mov r4, r9\n\
  3356.    adds r0, r1, r4\n\
  3357.    adds r0, 0x20\n\
  3358.    ldrb r0, [r0]\n\
  3359.    cmp r0, 0x48\n\
  3360.    bne _0801E61A\n\
  3361.    b _0801EA14\n\
  3362. _0801E61A:\n\
  3363.    cmp r0, 0xF\n\
  3364.    bne _0801E620\n\
  3365.    b _0801EA14\n\
  3366. _0801E620:\n\
  3367.    adds r0, r2, 0\n\
  3368.    bl CancelMultiTurnMoves\n\
  3369.    b _0801EA04\n\
  3370.    .align 2, 0\n\
  3371. _0801E628: .4byte gActiveBattler\n\
  3372. _0801E62C: .4byte gBattlersCount\n\
  3373. _0801E630:\n\
  3374.    mov r2, r8\n\
  3375.    ldrb r1, [r2]\n\
  3376.    movs r0, 0x58\n\
  3377.    muls r0, r1\n\
  3378.    add r0, r9\n\
  3379.    adds r0, 0x20\n\
  3380.    ldrb r1, [r0]\n\
  3381.    cmp r1, 0x11\n\
  3382.    bne _0801E688\n\
  3383.    cmp r4, 0x1\n\
  3384.    beq _0801E64A\n\
  3385.    cmp r5, 0x80\n\
  3386.    bne _0801E688\n\
  3387. _0801E64A:\n\
  3388.    ldr r0, _0801E678 @ =gLastUsedAbility\n\
  3389.    strb r1, [r0]\n\
  3390.    mov r3, r8\n\
  3391.    ldrb r0, [r3]\n\
  3392.    movs r1, 0x11\n\
  3393.    bl RecordAbilityBattle\n\
  3394.    ldr r4, _0801E67C @ =gBattlescriptCurrInstr\n\
  3395.    ldr r0, [r4]\n\
  3396.    adds r0, 0x1\n\
  3397.    bl BattleScriptPush\n\
  3398.    ldr r0, _0801E680 @ =BattleScript_PSNPrevention\n\
  3399. _0801E664:\n\
  3400.    str r0, [r4]\n\
  3401.    ldr r2, _0801E684 @ =gHitMarker\n\
  3402.    ldr r1, [r2]\n\
  3403.    movs r0, 0x80\n\
  3404.    lsls r0, 6\n\
  3405.    ands r0, r1\n\
  3406.    cmp r0, 0\n\
  3407.    beq _0801E676\n\
  3408.    b _0801E928\n\
  3409. _0801E676:\n\
  3410.    b _0801E94C\n\
  3411.    .align 2, 0\n\
  3412. _0801E678: .4byte gLastUsedAbility\n\
  3413. _0801E67C: .4byte gBattlescriptCurrInstr\n\
  3414. _0801E680: .4byte BattleScript_PSNPrevention\n\
  3415. _0801E684: .4byte gHitMarker\n\
  3416. _0801E688:\n\
  3417.    mov r1, r8\n\
  3418.    ldrb r0, [r1]\n\
  3419.    movs r1, 0x58\n\
  3420.    muls r0, r1\n\
  3421.    add r0, r9\n\
  3422.    adds r1, r0, 0\n\
  3423.    adds r1, 0x21\n\
  3424.    ldrb r1, [r1]\n\
  3425.    cmp r1, 0x3\n\
  3426.    beq _0801E6AC\n\
  3427.    adds r0, 0x22\n\
  3428.    ldrb r0, [r0]\n\
  3429.    cmp r0, 0x3\n\
  3430.    beq _0801E6AC\n\
  3431.    cmp r1, 0x8\n\
  3432.    beq _0801E6AC\n\
  3433.    cmp r0, 0x8\n\
  3434.    bne _0801E6C6\n\
  3435. _0801E6AC:\n\
  3436.    ldr r0, _0801E710 @ =gHitMarker\n\
  3437.    ldr r0, [r0]\n\
  3438.    movs r1, 0x80\n\
  3439.    lsls r1, 6\n\
  3440.    ands r0, r1\n\
  3441.    cmp r0, 0\n\
  3442.    beq _0801E6C6\n\
  3443.    cmp r4, 0x1\n\
  3444.    bne _0801E6C0\n\
  3445.    b _0801E98C\n\
  3446. _0801E6C0:\n\
  3447.    cmp r5, 0x80\n\
  3448.    bne _0801E6C6\n\
  3449.    b _0801E98C\n\
  3450. _0801E6C6:\n\
  3451.    mov r2, r8\n\
  3452.    ldrb r1, [r2]\n\
  3453.    movs r0, 0x58\n\
  3454.    muls r1, r0\n\
  3455.    mov r4, r9\n\
  3456.    adds r3, r1, r4\n\
  3457.    adds r0, r3, 0\n\
  3458.    adds r0, 0x21\n\
  3459.    ldrb r4, [r0]\n\
  3460.    cmp r4, 0x3\n\
  3461.    bne _0801E6DE\n\
  3462.    b _0801EA14\n\
  3463. _0801E6DE:\n\
  3464.    adds r0, 0x1\n\
  3465.    ldrb r0, [r0]\n\
  3466.    cmp r0, 0x3\n\
  3467.    bne _0801E6E8\n\
  3468.    b _0801EA14\n\
  3469. _0801E6E8:\n\
  3470.    cmp r4, 0x8\n\
  3471.    bne _0801E6EE\n\
  3472.    b _0801EA14\n\
  3473. _0801E6EE:\n\
  3474.    cmp r0, 0x8\n\
  3475.    bne _0801E6F4\n\
  3476.    b _0801EA14\n\
  3477. _0801E6F4:\n\
  3478.    mov r0, r9\n\
  3479.    adds r0, 0x4C\n\
  3480.    adds r0, r1, r0\n\
  3481.    ldr r0, [r0]\n\
  3482.    cmp r0, 0\n\
  3483.    beq _0801E702\n\
  3484.    b _0801EA14\n\
  3485. _0801E702:\n\
  3486.    adds r0, r3, 0\n\
  3487.    adds r0, 0x20\n\
  3488.    ldrb r0, [r0]\n\
  3489.    cmp r0, 0x11\n\
  3490.    bne _0801E70E\n\
  3491.    b _0801EA14\n\
  3492. _0801E70E:\n\
  3493.    b _0801EA04\n\
  3494.    .align 2, 0\n\
  3495. _0801E710: .4byte gHitMarker\n\
  3496. _0801E714:\n\
  3497.    mov r2, r8\n\
  3498.    ldrb r1, [r2]\n\
  3499.    movs r0, 0x58\n\
  3500.    muls r0, r1\n\
  3501.    add r0, r9\n\
  3502.    adds r0, 0x20\n\
  3503.    ldrb r1, [r0]\n\
  3504.    cmp r1, 0x29\n\
  3505.    bne _0801E758\n\
  3506.    cmp r4, 0x1\n\
  3507.    beq _0801E72E\n\
  3508.    cmp r5, 0x80\n\
  3509.    bne _0801E758\n\
  3510. _0801E72E:\n\
  3511.    ldr r0, _0801E74C @ =gLastUsedAbility\n\
  3512.    strb r1, [r0]\n\
  3513.    mov r3, r8\n\
  3514.    ldrb r0, [r3]\n\
  3515.    movs r1, 0x29\n\
  3516.    bl RecordAbilityBattle\n\
  3517.    ldr r4, _0801E750 @ =gBattlescriptCurrInstr\n\
  3518.    ldr r0, [r4]\n\
  3519.    adds r0, 0x1\n\
  3520.    bl BattleScriptPush\n\
  3521.    ldr r0, _0801E754 @ =BattleScript_BRNPrevention\n\
  3522.    b _0801E664\n\
  3523.    .align 2, 0\n\
  3524. _0801E74C: .4byte gLastUsedAbility\n\
  3525. _0801E750: .4byte gBattlescriptCurrInstr\n\
  3526. _0801E754: .4byte BattleScript_BRNPrevention\n\
  3527. _0801E758:\n\
  3528.    mov r0, r8\n\
  3529.    ldrb r1, [r0]\n\
  3530.    movs r0, 0x58\n\
  3531.    muls r0, r1\n\
  3532.    mov r2, r9\n\
  3533.    adds r1, r0, r2\n\
  3534.    adds r0, r1, 0\n\
  3535.    adds r0, 0x21\n\
  3536.    ldrb r0, [r0]\n\
  3537.    cmp r0, 0xA\n\
  3538.    beq _0801E778\n\
  3539.    adds r0, r1, 0\n\
  3540.    adds r0, 0x22\n\
  3541.    ldrb r0, [r0]\n\
  3542.    cmp r0, 0xA\n\
  3543.    bne _0801E7A8\n\
  3544. _0801E778:\n\
  3545.    ldr r0, _0801E79C @ =gHitMarker\n\
  3546.    ldr r0, [r0]\n\
  3547.    movs r1, 0x80\n\
  3548.    lsls r1, 6\n\
  3549.    ands r0, r1\n\
  3550.    cmp r0, 0\n\
  3551.    beq _0801E7A8\n\
  3552.    cmp r4, 0x1\n\
  3553.    beq _0801E78E\n\
  3554.    cmp r5, 0x80\n\
  3555.    bne _0801E7A8\n\
  3556. _0801E78E:\n\
  3557.    ldr r4, _0801E7A0 @ =gBattlescriptCurrInstr\n\
  3558.    ldr r0, [r4]\n\
  3559.    adds r0, 0x1\n\
  3560.    bl BattleScriptPush\n\
  3561.    ldr r0, _0801E7A4 @ =BattleScript_BRNPrevention\n\
  3562.    b _0801E998\n\
  3563.    .align 2, 0\n\
  3564. _0801E79C: .4byte gHitMarker\n\
  3565. _0801E7A0: .4byte gBattlescriptCurrInstr\n\
  3566. _0801E7A4: .4byte BattleScript_BRNPrevention\n\
  3567. _0801E7A8:\n\
  3568.    mov r3, r8\n\
  3569.    ldrb r0, [r3]\n\
  3570.    movs r1, 0x58\n\
  3571.    adds r2, r0, 0\n\
  3572.    muls r2, r1\n\
  3573.    mov r4, r9\n\
  3574.    adds r1, r2, r4\n\
  3575.    adds r0, r1, 0\n\
  3576.    adds r0, 0x21\n\
  3577.    ldrb r0, [r0]\n\
  3578.    cmp r0, 0xA\n\
  3579.    bne _0801E7C2\n\
  3580.    b _0801EA14\n\
  3581. _0801E7C2:\n\
  3582.    adds r0, r1, 0\n\
  3583.    adds r0, 0x22\n\
  3584.    ldrb r0, [r0]\n\
  3585.    cmp r0, 0xA\n\
  3586.    bne _0801E7CE\n\
  3587.    b _0801EA14\n\
  3588. _0801E7CE:\n\
  3589.    adds r0, r1, 0\n\
  3590.    adds r0, 0x20\n\
  3591.    ldrb r0, [r0]\n\
  3592.    cmp r0, 0x29\n\
  3593.    bne _0801E7DA\n\
  3594.    b _0801EA14\n\
  3595. _0801E7DA:\n\
  3596.    mov r0, r9\n\
  3597.    adds r0, 0x4C\n\
  3598.    adds r0, r2, r0\n\
  3599.    ldr r0, [r0]\n\
  3600.    cmp r0, 0\n\
  3601.    beq _0801E7E8\n\
  3602.    b _0801EA14\n\
  3603. _0801E7E8:\n\
  3604.    b _0801EA04\n\
  3605. _0801E7EA:\n\
  3606.    movs r0, 0\n\
  3607.    str r0, [sp]\n\
  3608.    movs r0, 0x13\n\
  3609.    movs r1, 0\n\
  3610.    movs r2, 0xD\n\
  3611.    movs r3, 0\n\
  3612.    bl AbilityBattleEffects\n\
  3613.    lsls r0, 24\n\
  3614.    lsrs r0, 24\n\
  3615.    cmp r0, 0\n\
  3616.    bne _0801E826\n\
  3617.    str r0, [sp]\n\
  3618.    movs r0, 0x13\n\
  3619.    movs r1, 0\n\
  3620.    movs r2, 0x4D\n\
  3621.    movs r3, 0\n\
  3622.    bl AbilityBattleEffects\n\
  3623.    lsls r0, 24\n\
  3624.    cmp r0, 0\n\
  3625.    bne _0801E826\n\
  3626.    ldr r0, _0801E87C @ =gBattleWeather\n\
  3627.    ldrh r1, [r0]\n\
  3628.    movs r0, 0x60\n\
  3629.    ands r0, r1\n\
  3630.    cmp r0, 0\n\
  3631.    beq _0801E826\n\
  3632.    movs r1, 0\n\
  3633.    str r1, [sp, 0x4]\n\
  3634. _0801E826:\n\
  3635.    ldr r4, _0801E880 @ =gBattleMons\n\
  3636.    ldr r0, _0801E884 @ =gEffectBank\n\
  3637.    ldrb r3, [r0]\n\
  3638.    movs r0, 0x58\n\
  3639.    adds r2, r3, 0\n\
  3640.    muls r2, r0\n\
  3641.    adds r1, r2, r4\n\
  3642.    adds r0, r1, 0\n\
  3643.    adds r0, 0x21\n\
  3644.    ldrb r0, [r0]\n\
  3645.    cmp r0, 0xF\n\
  3646.    bne _0801E840\n\
  3647.    b _0801EA14\n\
  3648. _0801E840:\n\
  3649.    adds r0, r1, 0\n\
  3650.    adds r0, 0x22\n\
  3651.    ldrb r0, [r0]\n\
  3652.    cmp r0, 0xF\n\
  3653.    bne _0801E84C\n\
  3654.    b _0801EA14\n\
  3655. _0801E84C:\n\
  3656.    adds r0, r4, 0\n\
  3657.    adds r0, 0x4C\n\
  3658.    adds r0, r2, r0\n\
  3659.    ldr r0, [r0]\n\
  3660.    cmp r0, 0\n\
  3661.    beq _0801E85A\n\
  3662.    b _0801EA14\n\
  3663. _0801E85A:\n\
  3664.    ldr r2, [sp, 0x4]\n\
  3665.    cmp r2, 0\n\
  3666.    bne _0801E862\n\
  3667.    b _0801EA14\n\
  3668. _0801E862:\n\
  3669.    adds r0, r1, 0\n\
  3670.    adds r0, 0x20\n\
  3671.    ldrb r0, [r0]\n\
  3672.    cmp r0, 0x28\n\
  3673.    bne _0801E86E\n\
  3674.    b _0801EA14\n\
  3675. _0801E86E:\n\
  3676.    adds r0, r3, 0\n\
  3677.    bl CancelMultiTurnMoves\n\
  3678.    movs r3, 0x1\n\
  3679.    mov r10, r3\n\
  3680.    b _0801EA14\n\
  3681.    .align 2, 0\n\
  3682. _0801E87C: .4byte gBattleWeather\n\
  3683. _0801E880: .4byte gBattleMons\n\
  3684. _0801E884: .4byte gEffectBank\n\
  3685. _0801E888:\n\
  3686.    mov r0, r8\n\
  3687.    ldrb r1, [r0]\n\
  3688.    movs r0, 0x58\n\
  3689.    muls r1, r0\n\
  3690.    mov r2, r9\n\
  3691.    adds r0, r1, r2\n\
  3692.    adds r0, 0x20\n\
  3693.    ldrb r2, [r0]\n\
  3694.    cmp r2, 0x7\n\
  3695.    bne _0801E8D0\n\
  3696.    cmp r4, 0x1\n\
  3697.    beq _0801E8A6\n\
  3698.    cmp r5, 0x80\n\
  3699.    beq _0801E8A6\n\
  3700.    b _0801EA14\n\
  3701. _0801E8A6:\n\
  3702.    ldr r0, _0801E8C4 @ =gLastUsedAbility\n\
  3703.    strb r2, [r0]\n\
  3704.    mov r3, r8\n\
  3705.    ldrb r0, [r3]\n\
  3706.    movs r1, 0x7\n\
  3707.    bl RecordAbilityBattle\n\
  3708.    ldr r4, _0801E8C8 @ =gBattlescriptCurrInstr\n\
  3709.    ldr r0, [r4]\n\
  3710.    adds r0, 0x1\n\
  3711.    bl BattleScriptPush\n\
  3712.    ldr r0, _0801E8CC @ =BattleScript_PRLZPrevention\n\
  3713.    b _0801E664\n\
  3714.    .align 2, 0\n\
  3715. _0801E8C4: .4byte gLastUsedAbility\n\
  3716. _0801E8C8: .4byte gBattlescriptCurrInstr\n\
  3717. _0801E8CC: .4byte BattleScript_PRLZPrevention\n\
  3718. _0801E8D0:\n\
  3719.    mov r0, r9\n\
  3720.    adds r0, 0x4C\n\
  3721.    adds r0, r1, r0\n\
  3722.    ldr r0, [r0]\n\
  3723.    cmp r0, 0\n\
  3724.    beq _0801E8DE\n\
  3725.    b _0801EA14\n\
  3726. _0801E8DE:\n\
  3727.    movs r4, 0x1\n\
  3728.    mov r10, r4\n\
  3729.    b _0801EA14\n\
  3730. _0801E8E4:\n\
  3731.    mov r0, r8\n\
  3732.    ldrb r1, [r0]\n\
  3733.    movs r0, 0x58\n\
  3734.    muls r0, r1\n\
  3735.    add r0, r9\n\
  3736.    adds r0, 0x20\n\
  3737.    ldrb r1, [r0]\n\
  3738.    cmp r1, 0x11\n\
  3739.    bne _0801E952\n\
  3740.    cmp r4, 0x1\n\
  3741.    beq _0801E8FE\n\
  3742.    cmp r5, 0x80\n\
  3743.    bne _0801E952\n\
  3744. _0801E8FE:\n\
  3745.    ldr r0, _0801E938 @ =gLastUsedAbility\n\
  3746.    strb r1, [r0]\n\
  3747.    mov r1, r8\n\
  3748.    ldrb r0, [r1]\n\
  3749.    movs r1, 0x11\n\
  3750.    bl RecordAbilityBattle\n\
  3751.    ldr r4, _0801E93C @ =gBattlescriptCurrInstr\n\
  3752.    ldr r0, [r4]\n\
  3753.    adds r0, 0x1\n\
  3754.    bl BattleScriptPush\n\
  3755.    ldr r0, _0801E940 @ =BattleScript_PSNPrevention\n\
  3756.    str r0, [r4]\n\
  3757.    ldr r2, _0801E944 @ =gHitMarker\n\
  3758.    ldr r1, [r2]\n\
  3759.    movs r0, 0x80\n\
  3760.    lsls r0, 6\n\
  3761.    ands r0, r1\n\
  3762.    cmp r0, 0\n\
  3763.    beq _0801E94C\n\
  3764. _0801E928:\n\
  3765.    movs r0, 0x1\n\
  3766.    strb r0, [r7, 0x5]\n\
  3767.    ldr r0, _0801E948 @ =0xffffdfff\n\
  3768.    ands r1, r0\n\
  3769.    str r1, [r2]\n\
  3770.    bl _0801F5FA\n\
  3771.    .align 2, 0\n\
  3772. _0801E938: .4byte gLastUsedAbility\n\
  3773. _0801E93C: .4byte gBattlescriptCurrInstr\n\
  3774. _0801E940: .4byte BattleScript_PSNPrevention\n\
  3775. _0801E944: .4byte gHitMarker\n\
  3776. _0801E948: .4byte 0xffffdfff\n\
  3777. _0801E94C:\n\
  3778.    strb r0, [r7, 0x5]\n\
  3779.    bl _0801F5FA\n\
  3780. _0801E952:\n\
  3781.    mov r2, r8\n\
  3782.    ldrb r0, [r2]\n\
  3783.    movs r1, 0x58\n\
  3784.    muls r0, r1\n\
  3785.    add r0, r9\n\
  3786.    adds r1, r0, 0\n\
  3787.    adds r1, 0x21\n\
  3788.    ldrb r1, [r1]\n\
  3789.    cmp r1, 0x3\n\
  3790.    beq _0801E976\n\
  3791.    adds r0, 0x22\n\
  3792.    ldrb r0, [r0]\n\
  3793.    cmp r0, 0x3\n\
  3794.    beq _0801E976\n\
  3795.    cmp r1, 0x8\n\
  3796.    beq _0801E976\n\
  3797.    cmp r0, 0x8\n\
  3798.    bne _0801E9B4\n\
  3799. _0801E976:\n\
  3800.    ldr r0, _0801E9A4 @ =gHitMarker\n\
  3801.    ldr r0, [r0]\n\
  3802.    movs r1, 0x80\n\
  3803.    lsls r1, 6\n\
  3804.    ands r0, r1\n\
  3805.    cmp r0, 0\n\
  3806.    beq _0801E9B4\n\
  3807.    cmp r4, 0x1\n\
  3808.    beq _0801E98C\n\
  3809.    cmp r5, 0x80\n\
  3810.    bne _0801E9B4\n\
  3811. _0801E98C:\n\
  3812.    ldr r4, _0801E9A8 @ =gBattlescriptCurrInstr\n\
  3813.    ldr r0, [r4]\n\
  3814.    adds r0, 0x1\n\
  3815.    bl BattleScriptPush\n\
  3816.    ldr r0, _0801E9AC @ =BattleScript_PSNPrevention\n\
  3817. _0801E998:\n\
  3818.    str r0, [r4]\n\
  3819.    ldr r1, _0801E9B0 @ =gBattleCommunication\n\
  3820.    movs r0, 0x2\n\
  3821.    strb r0, [r1, 0x5]\n\
  3822.    bl _0801F5FA\n\
  3823.    .align 2, 0\n\
  3824. _0801E9A4: .4byte gHitMarker\n\
  3825. _0801E9A8: .4byte gBattlescriptCurrInstr\n\
  3826. _0801E9AC: .4byte BattleScript_PSNPrevention\n\
  3827. _0801E9B0: .4byte gBattleCommunication\n\
  3828. _0801E9B4:\n\
  3829.    mov r3, r8\n\
  3830.    ldrb r0, [r3]\n\
  3831.    movs r6, 0x58\n\
  3832.    muls r0, r6\n\
  3833.    mov r2, r9\n\
  3834.    adds r2, 0x4C\n\
  3835.    adds r5, r0, r2\n\
  3836.    ldr r4, [r5]\n\
  3837.    cmp r4, 0\n\
  3838.    bne _0801EA14\n\
  3839.    mov r3, r9\n\
  3840.    adds r1, r0, r3\n\
  3841.    adds r0, r1, 0\n\
  3842.    adds r0, 0x21\n\
  3843.    ldrb r3, [r0]\n\
  3844.    cmp r3, 0x3\n\
  3845.    beq _0801EA0A\n\
  3846.    adds r0, 0x1\n\
  3847.    ldrb r0, [r0]\n\
  3848.    cmp r0, 0x3\n\
  3849.    beq _0801EA0A\n\
  3850.    cmp r3, 0x8\n\
  3851.    beq _0801EA0A\n\
  3852.    cmp r0, 0x8\n\
  3853.    beq _0801EA0A\n\
  3854.    adds r0, r1, 0\n\
  3855.    adds r0, 0x20\n\
  3856.    ldrb r0, [r0]\n\
  3857.    cmp r0, 0x11\n\
  3858.    beq _0801EA14\n\
  3859.    mov r4, r8\n\
  3860.    ldrb r0, [r4]\n\
  3861.    adds r1, r0, 0\n\
  3862.    muls r1, r6\n\
  3863.    adds r1, r2\n\
  3864.    ldr r0, [r1]\n\
  3865.    movs r2, 0x9\n\
  3866.    negs r2, r2\n\
  3867.    ands r0, r2\n\
  3868.    str r0, [r1]\n\
  3869. _0801EA04:\n\
  3870.    movs r0, 0x1\n\
  3871.    mov r10, r0\n\
  3872.    b _0801EA14\n\
  3873. _0801EA0A:\n\
  3874.    ldr r0, _0801EA58 @ =gMoveResultFlags\n\
  3875.    ldrb r1, [r0]\n\
  3876.    movs r2, 0x8\n\
  3877.    orrs r1, r2\n\
  3878.    strb r1, [r0]\n\
  3879. _0801EA14:\n\
  3880.    mov r1, r10\n\
  3881.    cmp r1, 0x1\n\
  3882.    beq _0801EA1C\n\
  3883.    b _0801EB3C\n\
  3884. _0801EA1C:\n\
  3885.    ldr r0, _0801EA5C @ =gBattlescriptCurrInstr\n\
  3886.    ldr r0, [r0]\n\
  3887.    adds r0, 0x1\n\
  3888.    bl BattleScriptPush\n\
  3889.    ldr r1, _0801EA60 @ =sStatusFlagsForMoveEffects\n\
  3890.    ldr r0, _0801EA64 @ =gBattleCommunication\n\
  3891.    ldrb r0, [r0, 0x3]\n\
  3892.    lsls r0, 2\n\
  3893.    adds r0, r1\n\
  3894.    ldr r3, [r0]\n\
  3895.    cmp r3, 0x7\n\
  3896.    bne _0801EA70\n\
  3897.    bl Random\n\
  3898.    ldr r2, _0801EA68 @ =gBattleMons\n\
  3899.    ldr r1, _0801EA6C @ =gEffectBank\n\
  3900.    ldrb r3, [r1]\n\
  3901.    movs r1, 0x58\n\
  3902.    muls r3, r1\n\
  3903.    adds r2, 0x4C\n\
  3904.    adds r3, r2\n\
  3905.    movs r1, 0x3\n\
  3906.    ands r1, r0\n\
  3907.    adds r1, 0x2\n\
  3908.    ldr r0, [r3]\n\
  3909.    orrs r0, r1\n\
  3910.    str r0, [r3]\n\
  3911.    b _0801EA84\n\
  3912.    .align 2, 0\n\
  3913. _0801EA58: .4byte gMoveResultFlags\n\
  3914. _0801EA5C: .4byte gBattlescriptCurrInstr\n\
  3915. _0801EA60: .4byte sStatusFlagsForMoveEffects\n\
  3916. _0801EA64: .4byte gBattleCommunication\n\
  3917. _0801EA68: .4byte gBattleMons\n\
  3918. _0801EA6C: .4byte gEffectBank\n\
  3919. _0801EA70:\n\
  3920.    ldr r2, _0801EAD4 @ =gBattleMons\n\
  3921.    ldr r0, _0801EAD8 @ =gEffectBank\n\
  3922.    ldrb r1, [r0]\n\
  3923.    movs r0, 0x58\n\
  3924.    muls r1, r0\n\
  3925.    adds r2, 0x4C\n\
  3926.    adds r1, r2\n\
  3927.    ldr r0, [r1]\n\
  3928.    orrs r0, r3\n\
  3929.    str r0, [r1]\n\
  3930. _0801EA84:\n\
  3931.    ldr r2, _0801EADC @ =gBattlescriptCurrInstr\n\
  3932.    ldr r1, _0801EAE0 @ =gMoveEffectBS_Ptrs\n\
  3933.    ldr r5, _0801EAE4 @ =gBattleCommunication\n\
  3934.    ldrb r0, [r5, 0x3]\n\
  3935.    lsls r0, 2\n\
  3936.    adds r0, r1\n\
  3937.    ldr r0, [r0]\n\
  3938.    str r0, [r2]\n\
  3939.    ldr r4, _0801EAE8 @ =gActiveBattler\n\
  3940.    ldr r1, _0801EAD8 @ =gEffectBank\n\
  3941.    ldrb r0, [r1]\n\
  3942.    strb r0, [r4]\n\
  3943.    ldrb r1, [r1]\n\
  3944.    movs r0, 0x58\n\
  3945.    muls r0, r1\n\
  3946.    ldr r1, _0801EAEC @ =gBattleMons+0x4C @ gBattleMons.status1\n\
  3947.    adds r0, r1\n\
  3948.    str r0, [sp]\n\
  3949.    movs r0, 0\n\
  3950.    movs r1, 0x28\n\
  3951.    movs r2, 0\n\
  3952.    movs r3, 0x4\n\
  3953.    bl EmitSetMonData\n\
  3954.    ldrb r0, [r4]\n\
  3955.    bl MarkBufferBankForExecution\n\
  3956.    ldr r2, _0801EAF0 @ =gHitMarker\n\
  3957.    ldr r1, [r2]\n\
  3958.    movs r0, 0x80\n\
  3959.    lsls r0, 6\n\
  3960.    ands r0, r1\n\
  3961.    cmp r0, 0\n\
  3962.    beq _0801EAF8\n\
  3963.    movs r0, 0x1\n\
  3964.    strb r0, [r5, 0x5]\n\
  3965.    ldr r0, _0801EAF4 @ =0xffffdfff\n\
  3966.    ands r1, r0\n\
  3967.    str r1, [r2]\n\
  3968.    b _0801EAFA\n\
  3969.    .align 2, 0\n\
  3970. _0801EAD4: .4byte gBattleMons\n\
  3971. _0801EAD8: .4byte gEffectBank\n\
  3972. _0801EADC: .4byte gBattlescriptCurrInstr\n\
  3973. _0801EAE0: .4byte gMoveEffectBS_Ptrs\n\
  3974. _0801EAE4: .4byte gBattleCommunication\n\
  3975. _0801EAE8: .4byte gActiveBattler\n\
  3976. _0801EAEC: .4byte gBattleMons+0x4C @ gBattleMons.status1\n\
  3977. _0801EAF0: .4byte gHitMarker\n\
  3978. _0801EAF4: .4byte 0xffffdfff\n\
  3979. _0801EAF8:\n\
  3980.    strb r0, [r5, 0x5]\n\
  3981. _0801EAFA:\n\
  3982.    ldr r0, _0801EB2C @ =gBattleCommunication\n\
  3983.    ldrb r2, [r0, 0x3]\n\
  3984.    adds r7, r0, 0\n\
  3985.    cmp r2, 0x2\n\
  3986.    beq _0801EB14\n\
  3987.    cmp r2, 0x6\n\
  3988.    beq _0801EB14\n\
  3989.    cmp r2, 0x5\n\
  3990.    beq _0801EB14\n\
  3991.    cmp r2, 0x3\n\
  3992.    beq _0801EB14\n\
  3993.    bl _0801F5FA\n\
  3994. _0801EB14:\n\
  3995.    ldr r0, _0801EB30 @ =gSharedMem\n\
  3996.    ldrb r1, [r7, 0x3]\n\
  3997.    ldr r2, _0801EB34 @ =0x000160ca\n\
  3998.    adds r0, r2\n\
  3999.    strb r1, [r0]\n\
  4000.    ldr r2, _0801EB38 @ =gHitMarker\n\
  4001.    ldr r0, [r2]\n\
  4002.    movs r1, 0x80\n\
  4003.    lsls r1, 7\n\
  4004.    bl _0801F4F2\n\
  4005.    .align 2, 0\n\
  4006. _0801EB2C: .4byte gBattleCommunication\n\
  4007. _0801EB30: .4byte gSharedMem\n\
  4008. _0801EB34: .4byte 0x000160ca\n\
  4009. _0801EB38: .4byte gHitMarker\n\
  4010. _0801EB3C:\n\
  4011.    mov r3, r10\n\
  4012.    cmp r3, 0\n\
  4013.    beq _0801EB46\n\
  4014.    bl _0801F5FA\n\
  4015. _0801EB46:\n\
  4016.    bl _0801F5DC\n\
  4017. _0801EB4A:\n\
  4018.    mov r0, r8\n\
  4019.    ldrb r1, [r0]\n\
  4020.    movs r0, 0x58\n\
  4021.    muls r1, r0\n\
  4022.    mov r0, r9\n\
  4023.    adds r0, 0x50\n\
  4024.    adds r1, r0\n\
  4025.    ldr r2, _0801EB84 @ =sStatusFlagsForMoveEffects\n\
  4026.    ldrb r3, [r7, 0x3]\n\
  4027.    lsls r0, r3, 2\n\
  4028.    adds r0, r2\n\
  4029.    ldr r1, [r1]\n\
  4030.    ldr r0, [r0]\n\
  4031.    ands r1, r0\n\
  4032.    cmp r1, 0\n\
  4033.    beq _0801EB6E\n\
  4034.    bl _0801F5DC\n\
  4035. _0801EB6E:\n\
  4036.    subs r0, r3, 0x7\n\
  4037.    cmp r0, 0x34\n\
  4038.    bls _0801EB78\n\
  4039.    bl _0801F5FA\n\
  4040. _0801EB78:\n\
  4041.    lsls r0, 2\n\
  4042.    ldr r1, _0801EB88 @ =_0801EB8C\n\
  4043.    adds r0, r1\n\
  4044.    ldr r0, [r0]\n\
  4045.    mov pc, r0\n\
  4046.    .align 2, 0\n\
  4047. _0801EB84: .4byte sStatusFlagsForMoveEffects\n\
  4048. _0801EB88: .4byte _0801EB8C\n\
  4049.    .align 2, 0\n\
  4050. _0801EB8C:\n\
  4051.    .4byte _0801EC60\n\
  4052.    .4byte _0801ECD4\n\
  4053.    .4byte _0801EE4C\n\
  4054.    .4byte _0801ED60\n\
  4055.    .4byte _0801EDDC\n\
  4056.    .4byte _0801EE84\n\
  4057.    .4byte _0801EECC\n\
  4058.    .4byte _0801EFA8\n\
  4059.    .4byte _0801EFEC\n\
  4060.    .4byte _0801EFEC\n\
  4061.    .4byte _0801EFEC\n\
  4062.    .4byte _0801EFEC\n\
  4063.    .4byte _0801EFEC\n\
  4064.    .4byte _0801EFEC\n\
  4065.    .4byte _0801EFEC\n\
  4066.    .4byte _0801F040\n\
  4067.    .4byte _0801F040\n\
  4068.    .4byte _0801F040\n\
  4069.    .4byte _0801F040\n\
  4070.    .4byte _0801F040\n\
  4071.    .4byte _0801F040\n\
  4072.    .4byte _0801F040\n\
  4073.    .4byte _0801F13C\n\
  4074.    .4byte _0801F184\n\
  4075.    .4byte _0801F1A4\n\
  4076.    .4byte _0801F364\n\
  4077.    .4byte _0801F3A0\n\
  4078.    .4byte _0801F3BC\n\
  4079.    .4byte _0801F3D4\n\
  4080.    .4byte _0801F3EC\n\
  4081.    .4byte _0801F44C\n\
  4082.    .4byte _0801F464\n\
  4083.    .4byte _0801F094\n\
  4084.    .4byte _0801F094\n\
  4085.    .4byte _0801F094\n\
  4086.    .4byte _0801F094\n\
  4087.    .4byte _0801F094\n\
  4088.    .4byte _0801F094\n\
  4089.    .4byte _0801F094\n\
  4090.    .4byte _0801F0E8\n\
  4091.    .4byte _0801F0E8\n\
  4092.    .4byte _0801F0E8\n\
  4093.    .4byte _0801F0E8\n\
  4094.    .4byte _0801F0E8\n\
  4095.    .4byte _0801F0E8\n\
  4096.    .4byte _0801F0E8\n\
  4097.    .4byte _0801F4A8\n\
  4098.    .4byte _0801F500\n\
  4099.    .4byte _0801F5FA\n\
  4100.    .4byte _0801F5FA\n\
  4101.    .4byte _0801F5FA\n\
  4102.    .4byte _0801F5FA\n\
  4103.    .4byte _0801F5EC\n\
  4104. _0801EC60:\n\
  4105.    mov r1, r8\n\
  4106.    ldrb r0, [r1]\n\
  4107.    movs r5, 0x58\n\
  4108.    adds r1, r0, 0\n\
  4109.    muls r1, r5\n\
  4110.    mov r2, r9\n\
  4111.    adds r0, r1, r2\n\
  4112.    adds r0, 0x20\n\
  4113.    ldrb r0, [r0]\n\
  4114.    cmp r0, 0x14\n\
  4115.    bne _0801EC7A\n\
  4116.    bl _0801F5DC\n\
  4117. _0801EC7A:\n\
  4118.    mov r4, r9\n\
  4119.    adds r4, 0x50\n\
  4120.    adds r0, r1, r4\n\
  4121.    ldr r0, [r0]\n\
  4122.    movs r1, 0x7\n\
  4123.    ands r0, r1\n\
  4124.    cmp r0, 0\n\
  4125.    beq _0801EC8E\n\
  4126.    bl _0801F5DC\n\
  4127. _0801EC8E:\n\
  4128.    bl Random\n\
  4129.    mov r3, r8\n\
  4130.    ldrb r1, [r3]\n\
  4131.    adds r2, r1, 0\n\
  4132.    muls r2, r5\n\
  4133.    adds r2, r4\n\
  4134.    lsls r0, 16\n\
  4135.    movs r1, 0xC0\n\
  4136.    lsls r1, 10\n\
  4137.    ands r1, r0\n\
  4138.    lsrs r1, 16\n\
  4139.    adds r1, 0x2\n\
  4140.    ldr r0, [r2]\n\
  4141.    orrs r0, r1\n\
  4142.    str r0, [r2]\n\
  4143.    ldr r4, _0801ECC8 @ =gBattlescriptCurrInstr\n\
  4144.    ldr r0, [r4]\n\
  4145.    adds r0, 0x1\n\
  4146.    bl BattleScriptPush\n\
  4147.    ldr r1, _0801ECCC @ =gMoveEffectBS_Ptrs\n\
  4148.    ldr r0, _0801ECD0 @ =gBattleCommunication\n\
  4149.    ldrb r0, [r0, 0x3]\n\
  4150.    lsls r0, 2\n\
  4151.    adds r0, r1\n\
  4152.    ldr r0, [r0]\n\
  4153.    bl _0801F5F8\n\
  4154.    .align 2, 0\n\
  4155. _0801ECC8: .4byte gBattlescriptCurrInstr\n\
  4156. _0801ECCC: .4byte gMoveEffectBS_Ptrs\n\
  4157. _0801ECD0: .4byte gBattleCommunication\n\
  4158. _0801ECD4:\n\
  4159.    mov r0, r8\n\
  4160.    ldrb r2, [r0]\n\
  4161.    movs r6, 0x58\n\
  4162.    adds r0, r2, 0\n\
  4163.    muls r0, r6\n\
  4164.    add r0, r9\n\
  4165.    adds r0, 0x20\n\
  4166.    ldrb r1, [r0]\n\
  4167.    cmp r1, 0x27\n\
  4168.    bne _0801ED18\n\
  4169.    cmp r4, 0x1\n\
  4170.    beq _0801ECF4\n\
  4171.    cmp r5, 0x80\n\
  4172.    beq _0801ECF4\n\
  4173.    bl _0801F5DC\n\
  4174. _0801ECF4:\n\
  4175.    ldr r0, _0801ED0C @ =gLastUsedAbility\n\
  4176.    strb r1, [r0]\n\
  4177.    mov r1, r8\n\
  4178.    ldrb r0, [r1]\n\
  4179.    movs r1, 0x27\n\
  4180.    bl RecordAbilityBattle\n\
  4181.    ldr r1, _0801ED10 @ =gBattlescriptCurrInstr\n\
  4182.    ldr r0, _0801ED14 @ =BattleScript_FlinchPrevention\n\
  4183.    str r0, [r1]\n\
  4184.    bl _0801F5FA\n\
  4185.    .align 2, 0\n\
  4186. _0801ED0C: .4byte gLastUsedAbility\n\
  4187. _0801ED10: .4byte gBattlescriptCurrInstr\n\
  4188. _0801ED14: .4byte BattleScript_FlinchPrevention\n\
  4189. _0801ED18:\n\
  4190.    adds r0, r2, 0\n\
  4191.    bl BankGetTurnOrder\n\
  4192.    ldr r1, _0801ED54 @ =gCurrentTurnActionNumber\n\
  4193.    lsls r0, 24\n\
  4194.    lsrs r0, 24\n\
  4195.    ldrb r1, [r1]\n\
  4196.    cmp r0, r1\n\
  4197.    bhi _0801ED2E\n\
  4198.    bl _0801F5DC\n\
  4199. _0801ED2E:\n\
  4200.    mov r2, r8\n\
  4201.    ldrb r0, [r2]\n\
  4202.    adds r2, r0, 0\n\
  4203.    muls r2, r6\n\
  4204.    mov r0, r9\n\
  4205.    adds r0, 0x50\n\
  4206.    adds r2, r0\n\
  4207.    ldr r1, _0801ED58 @ =sStatusFlagsForMoveEffects\n\
  4208.    ldr r0, _0801ED5C @ =gBattleCommunication\n\
  4209.    ldrb r0, [r0, 0x3]\n\
  4210.    lsls r0, 2\n\
  4211.    adds r0, r1\n\
  4212.    ldr r1, [r2]\n\
  4213.    ldr r0, [r0]\n\
  4214.    orrs r1, r0\n\
  4215.    str r1, [r2]\n\
  4216.    bl _0801F5DC\n\
  4217.    .align 2, 0\n\
  4218. _0801ED54: .4byte gCurrentTurnActionNumber\n\
  4219. _0801ED58: .4byte sStatusFlagsForMoveEffects\n\
  4220. _0801ED5C: .4byte gBattleCommunication\n\
  4221. _0801ED60:\n\
  4222.    mov r3, r8\n\
  4223.    ldrb r0, [r3]\n\
  4224.    movs r5, 0x58\n\
  4225.    muls r0, r5\n\
  4226.    mov r4, r9\n\
  4227.    adds r4, 0x50\n\
  4228.    adds r2, r0, r4\n\
  4229.    ldr r1, [r2]\n\
  4230.    movs r0, 0x70\n\
  4231.    ands r0, r1\n\
  4232.    cmp r0, 0\n\
  4233.    beq _0801ED7C\n\
  4234.    bl _0801F5DC\n\
  4235. _0801ED7C:\n\
  4236.    movs r0, 0x80\n\
  4237.    lsls r0, 5\n\
  4238.    orrs r1, r0\n\
  4239.    str r1, [r2]\n\
  4240.    ldr r1, _0801EDC8 @ =gLockedMoves\n\
  4241.    ldrb r0, [r3]\n\
  4242.    lsls r0, 1\n\
  4243.    adds r0, r1\n\
  4244.    ldr r1, _0801EDCC @ =gCurrentMove\n\
  4245.    ldrh r1, [r1]\n\
  4246.    strh r1, [r0]\n\
  4247.    bl Random\n\
  4248.    mov r2, r8\n\
  4249.    ldrb r1, [r2]\n\
  4250.    adds r2, r1, 0\n\
  4251.    muls r2, r5\n\
  4252.    adds r2, r4\n\
  4253.    movs r1, 0x3\n\
  4254.    ands r1, r0\n\
  4255.    adds r1, 0x2\n\
  4256.    lsls r1, 4\n\
  4257.    ldr r0, [r2]\n\
  4258.    orrs r0, r1\n\
  4259.    str r0, [r2]\n\
  4260.    ldr r4, _0801EDD0 @ =gBattlescriptCurrInstr\n\
  4261.    ldr r0, [r4]\n\
  4262.    adds r0, 0x1\n\
  4263.    bl BattleScriptPush\n\
  4264.    ldr r1, _0801EDD4 @ =gMoveEffectBS_Ptrs\n\
  4265.    ldr r0, _0801EDD8 @ =gBattleCommunication\n\
  4266.    ldrb r0, [r0, 0x3]\n\
  4267.    lsls r0, 2\n\
  4268.    adds r0, r1\n\
  4269.    ldr r0, [r0]\n\
  4270.    bl _0801F5F8\n\
  4271.    .align 2, 0\n\
  4272. _0801EDC8: .4byte gLockedMoves\n\
  4273. _0801EDCC: .4byte gCurrentMove\n\
  4274. _0801EDD0: .4byte gBattlescriptCurrInstr\n\
  4275. _0801EDD4: .4byte gMoveEffectBS_Ptrs\n\
  4276. _0801EDD8: .4byte gBattleCommunication\n\
  4277. _0801EDDC:\n\
  4278.    ldr r5, _0801EE30 @ =gBankAttacker\n\
  4279.    ldrb r0, [r5]\n\
  4280.    bl GetBattlerPosition\n\
  4281.    movs r1, 0x1\n\
  4282.    ands r1, r0\n\
  4283.    cmp r1, 0\n\
  4284.    bne _0801EE14\n\
  4285.    ldr r4, _0801EE34 @ =gPaydayMoney\n\
  4286.    ldrh r3, [r4]\n\
  4287.    ldr r2, _0801EE38 @ =gBattleMons\n\
  4288.    ldrb r1, [r5]\n\
  4289.    movs r0, 0x58\n\
  4290.    muls r0, r1\n\
  4291.    adds r0, r2\n\
  4292.    adds r0, 0x2A\n\
  4293.    ldrb r1, [r0]\n\
  4294.    lsls r0, r1, 2\n\
  4295.    adds r0, r1\n\
  4296.    adds r0, r3, r0\n\
  4297.    strh r0, [r4]\n\
  4298.    lsls r0, 16\n\
  4299.    lsrs r0, 16\n\
  4300.    cmp r3, r0\n\
  4301.    bls _0801EE14\n\
  4302.    ldr r3, _0801EE3C @ =0x0000ffff\n\
  4303.    adds r0, r3, 0\n\
  4304.    strh r0, [r4]\n\
  4305. _0801EE14:\n\
  4306.    ldr r4, _0801EE40 @ =gBattlescriptCurrInstr\n\
  4307.    ldr r0, [r4]\n\
  4308.    adds r0, 0x1\n\
  4309.    bl BattleScriptPush\n\
  4310.    ldr r1, _0801EE44 @ =gMoveEffectBS_Ptrs\n\
  4311.    ldr r0, _0801EE48 @ =gBattleCommunication\n\
  4312.    ldrb r0, [r0, 0x3]\n\
  4313.    lsls r0, 2\n\
  4314.    adds r0, r1\n\
  4315.    ldr r0, [r0]\n\
  4316.    bl _0801F5F8\n\
  4317.    .align 2, 0\n\
  4318. _0801EE30: .4byte gBankAttacker\n\
  4319. _0801EE34: .4byte gPaydayMoney\n\
  4320. _0801EE38: .4byte gBattleMons\n\
  4321. _0801EE3C: .4byte 0x0000ffff\n\
  4322. _0801EE40: .4byte gBattlescriptCurrInstr\n\
  4323. _0801EE44: .4byte gMoveEffectBS_Ptrs\n\
  4324. _0801EE48: .4byte gBattleCommunication\n\
  4325. _0801EE4C:\n\
  4326.    mov r4, r8\n\
  4327.    ldrb r1, [r4]\n\
  4328.    movs r0, 0x58\n\
  4329.    muls r0, r1\n\
  4330.    mov r1, r9\n\
  4331.    adds r1, 0x4C\n\
  4332.    adds r0, r1\n\
  4333.    ldr r0, [r0]\n\
  4334.    cmp r0, 0\n\
  4335.    beq _0801EE62\n\
  4336.    b _0801F5DC\n\
  4337. _0801EE62:\n\
  4338.    bl Random\n\
  4339.    ldr r4, _0801EE80 @ =gBattleCommunication\n\
  4340.    lsls r0, 16\n\
  4341.    lsrs r0, 16\n\
  4342.    movs r1, 0x3\n\
  4343.    bl __umodsi3\n\
  4344.    adds r0, 0x3\n\
  4345.    strb r0, [r4, 0x3]\n\
  4346.    movs r0, 0\n\
  4347.    movs r1, 0\n\
  4348.    bl SetMoveEffect\n\
  4349.    b _0801F5FA\n\
  4350.    .align 2, 0\n\
  4351. _0801EE80: .4byte gBattleCommunication\n\
  4352. _0801EE84:\n\
  4353.    mov r0, r8\n\
  4354.    ldrb r1, [r0]\n\
  4355.    movs r0, 0x58\n\
  4356.    adds r2, r1, 0\n\
  4357.    muls r2, r0\n\
  4358.    mov r0, r9\n\
  4359.    adds r0, 0x50\n\
  4360.    adds r2, r0\n\
  4361.    ldr r0, [r2]\n\
  4362.    movs r1, 0x80\n\
  4363.    lsls r1, 5\n\
  4364.    orrs r0, r1\n\
  4365.    str r0, [r2]\n\
  4366.    ldr r1, _0801EEC0 @ =gLockedMoves\n\
  4367.    mov r2, r8\n\
  4368.    ldrb r0, [r2]\n\
  4369.    lsls r0, 1\n\
  4370.    adds r0, r1\n\
  4371.    ldr r1, _0801EEC4 @ =gCurrentMove\n\
  4372.    ldrh r1, [r1]\n\
  4373.    strh r1, [r0]\n\
  4374.    ldr r0, _0801EEC8 @ =gProtectStructs\n\
  4375.    ldrb r1, [r2]\n\
  4376.    lsls r1, 4\n\
  4377.    adds r1, r0\n\
  4378.    ldrb r0, [r1, 0x1]\n\
  4379.    movs r2, 0x4\n\
  4380.    orrs r0, r2\n\
  4381.    strb r0, [r1, 0x1]\n\
  4382.    b _0801F5DC\n\
  4383.    .align 2, 0\n\
  4384. _0801EEC0: .4byte gLockedMoves\n\
  4385. _0801EEC4: .4byte gCurrentMove\n\
  4386. _0801EEC8: .4byte gProtectStructs\n\
  4387. _0801EECC:\n\
  4388.    mov r3, r8\n\
  4389.    ldrb r0, [r3]\n\
  4390.    movs r6, 0x58\n\
  4391.    muls r0, r6\n\
  4392.    mov r4, r9\n\
  4393.    adds r4, 0x50\n\
  4394.    adds r0, r4\n\
  4395.    ldr r5, [r0]\n\
  4396.    movs r0, 0xE0\n\
  4397.    lsls r0, 8\n\
  4398.    ands r5, r0\n\
  4399.    cmp r5, 0\n\
  4400.    beq _0801EEE8\n\
  4401.    b _0801F5DC\n\
  4402. _0801EEE8:\n\
  4403.    bl Random\n\
  4404.    mov r2, r8\n\
  4405.    ldrb r1, [r2]\n\
  4406.    adds r2, r1, 0\n\
  4407.    muls r2, r6\n\
  4408.    adds r2, r4\n\
  4409.    movs r1, 0x3\n\
  4410.    ands r1, r0\n\
  4411.    adds r1, 0x3\n\
  4412.    lsls r1, 13\n\
  4413.    ldr r0, [r2]\n\
  4414.    orrs r0, r1\n\
  4415.    str r0, [r2]\n\
  4416.    ldr r2, _0801EF80 @ =gSharedMem\n\
  4417.    mov r3, r8\n\
  4418.    ldrb r0, [r3]\n\
  4419.    lsls r0, 1\n\
  4420.    ldr r4, _0801EF84 @ =0x00016004\n\
  4421.    adds r0, r4\n\
  4422.    adds r0, r2\n\
  4423.    ldr r6, _0801EF88 @ =gCurrentMove\n\
  4424.    ldrh r1, [r6]\n\
  4425.    strb r1, [r0]\n\
  4426.    ldrb r0, [r3]\n\
  4427.    lsls r0, 1\n\
  4428.    ldr r1, _0801EF8C @ =0x00016005\n\
  4429.    adds r0, r1\n\
  4430.    adds r0, r2\n\
  4431.    ldrh r1, [r6]\n\
  4432.    lsrs r1, 8\n\
  4433.    strb r1, [r0]\n\
  4434.    ldrb r0, [r3]\n\
  4435.    ldr r3, _0801EF90 @ =0x00016020\n\
  4436.    adds r0, r3\n\
  4437.    adds r0, r2\n\
  4438.    ldr r1, _0801EF94 @ =gBankAttacker\n\
  4439.    ldrb r1, [r1]\n\
  4440.    strb r1, [r0]\n\
  4441.    ldr r4, _0801EF98 @ =gBattlescriptCurrInstr\n\
  4442.    ldr r0, [r4]\n\
  4443.    adds r0, 0x1\n\
  4444.    bl BattleScriptPush\n\
  4445.    ldr r1, _0801EF9C @ =gMoveEffectBS_Ptrs\n\
  4446.    ldr r2, _0801EFA0 @ =gBattleCommunication\n\
  4447.    ldrb r0, [r2, 0x3]\n\
  4448.    lsls r0, 2\n\
  4449.    adds r0, r1\n\
  4450.    ldr r0, [r0]\n\
  4451.    str r0, [r4]\n\
  4452.    strb r5, [r2, 0x5]\n\
  4453.    ldr r1, _0801EFA4 @ =gTrappingMoves\n\
  4454.    ldrh r0, [r1]\n\
  4455.    ldrh r4, [r6]\n\
  4456.    cmp r0, r4\n\
  4457.    bne _0801EF5C\n\
  4458.    b _0801F5FA\n\
  4459. _0801EF5C:\n\
  4460.    adds r3, r1, 0\n\
  4461.    adds r1, r6, 0\n\
  4462. _0801EF60:\n\
  4463.    ldrb r0, [r2, 0x5]\n\
  4464.    adds r0, 0x1\n\
  4465.    strb r0, [r2, 0x5]\n\
  4466.    lsls r0, 24\n\
  4467.    lsrs r0, 24\n\
  4468.    cmp r0, 0x4\n\
  4469.    bls _0801EF70\n\
  4470.    b _0801F5FA\n\
  4471. _0801EF70:\n\
  4472.    ldrb r0, [r2, 0x5]\n\
  4473.    lsls r0, 1\n\
  4474.    adds r0, r3\n\
  4475.    ldrh r0, [r0]\n\
  4476.    ldrh r4, [r1]\n\
  4477.    cmp r0, r4\n\
  4478.    bne _0801EF60\n\
  4479.    b _0801F5FA\n\
  4480.    .align 2, 0\n\
  4481. _0801EF80: .4byte gSharedMem\n\
  4482. _0801EF84: .4byte 0x00016004\n\
  4483. _0801EF88: .4byte gCurrentMove\n\
  4484. _0801EF8C: .4byte 0x00016005\n\
  4485. _0801EF90: .4byte 0x00016020\n\
  4486. _0801EF94: .4byte gBankAttacker\n\
  4487. _0801EF98: .4byte gBattlescriptCurrInstr\n\
  4488. _0801EF9C: .4byte gMoveEffectBS_Ptrs\n\
  4489. _0801EFA0: .4byte gBattleCommunication\n\
  4490. _0801EFA4: .4byte gTrappingMoves\n\
  4491. _0801EFA8:\n\
  4492.    ldr r1, _0801EFD8 @ =gBattleMoveDamage\n\
  4493.    ldr r0, _0801EFDC @ =gHpDealt\n\
  4494.    ldr r0, [r0]\n\
  4495.    cmp r0, 0\n\
  4496.    bge _0801EFB4\n\
  4497.    adds r0, 0x3\n\
  4498. _0801EFB4:\n\
  4499.    asrs r0, 2\n\
  4500.    str r0, [r1]\n\
  4501.    cmp r0, 0\n\
  4502.    bne _0801EFC0\n\
  4503.    movs r0, 0x1\n\
  4504.    str r0, [r1]\n\
  4505. _0801EFC0:\n\
  4506.    ldr r4, _0801EFE0 @ =gBattlescriptCurrInstr\n\
  4507.    ldr r0, [r4]\n\
  4508.    adds r0, 0x1\n\
  4509.    bl BattleScriptPush\n\
  4510.    ldr r1, _0801EFE4 @ =gMoveEffectBS_Ptrs\n\
  4511.    ldr r0, _0801EFE8 @ =gBattleCommunication\n\
  4512.    ldrb r0, [r0, 0x3]\n\
  4513.    lsls r0, 2\n\
  4514.    adds r0, r1\n\
  4515.    ldr r0, [r0]\n\
  4516.    b _0801F5F8\n\
  4517.    .align 2, 0\n\
  4518. _0801EFD8: .4byte gBattleMoveDamage\n\
  4519. _0801EFDC: .4byte gHpDealt\n\
  4520. _0801EFE0: .4byte gBattlescriptCurrInstr\n\
  4521. _0801EFE4: .4byte gMoveEffectBS_Ptrs\n\
  4522. _0801EFE8: .4byte gBattleCommunication\n\
  4523. _0801EFEC:\n\
  4524.    ldrb r1, [r7, 0x3]\n\
  4525.    adds r1, 0xF2\n\
  4526.    lsls r1, 24\n\
  4527.    lsrs r1, 24\n\
  4528.    movs r0, 0x10\n\
  4529.    adds r2, r6, 0\n\
  4530.    movs r3, 0\n\
  4531.    bl ChangeStatBuffs\n\
  4532.    lsls r0, 24\n\
  4533.    lsrs r3, r0, 24\n\
  4534.    cmp r3, 0\n\
  4535.    beq _0801F008\n\
  4536.    b _0801F5DC\n\
  4537. _0801F008:\n\
  4538.    ldr r2, _0801F02C @ =gSharedMem\n\
  4539.    ldrb r1, [r7, 0x3]\n\
  4540.    movs r0, 0x3F\n\
  4541.    ands r0, r1\n\
  4542.    ldr r4, _0801F030 @ =0x000160a4\n\
  4543.    adds r1, r2, r4\n\
  4544.    strb r0, [r1]\n\
  4545.    ldr r0, _0801F034 @ =0x000160a5\n\
  4546.    adds r2, r0\n\
  4547.    strb r3, [r2]\n\
  4548.    ldr r4, _0801F038 @ =gBattlescriptCurrInstr\n\
  4549.    ldr r0, [r4]\n\
  4550.    adds r0, 0x1\n\
  4551.    bl BattleScriptPush\n\
  4552.    ldr r0, _0801F03C @ =BattleScript_StatUp\n\
  4553.    b _0801F5F8\n\
  4554.    .align 2, 0\n\
  4555. _0801F02C: .4byte gSharedMem\n\
  4556. _0801F030: .4byte 0x000160a4\n\
  4557. _0801F034: .4byte 0x000160a5\n\
  4558. _0801F038: .4byte gBattlescriptCurrInstr\n\
  4559. _0801F03C: .4byte BattleScript_StatUp\n\
  4560. _0801F040:\n\
  4561.    movs r0, 0x70\n\
  4562.    negs r0, r0\n\
  4563.    ldrb r1, [r7, 0x3]\n\
  4564.    adds r1, 0xEB\n\
  4565.    lsls r1, 24\n\
  4566.    lsrs r1, 24\n\
  4567.    adds r2, r6, 0\n\
  4568.    movs r3, 0\n\
  4569.    bl ChangeStatBuffs\n\
  4570.    lsls r0, 24\n\
  4571.    lsrs r3, r0, 24\n\
  4572.    cmp r3, 0\n\
  4573.    beq _0801F05E\n\
  4574.    b _0801F5DC\n\
  4575. _0801F05E:\n\
  4576.    ldr r2, _0801F080 @ =gSharedMem\n\
  4577.    ldrb r1, [r7, 0x3]\n\
  4578.    movs r0, 0x3F\n\
  4579.    ands r0, r1\n\
  4580.    ldr r4, _0801F084 @ =0x000160a4\n\
  4581.    adds r1, r2, r4\n\
  4582.    strb r0, [r1]\n\
  4583.    ldr r0, _0801F088 @ =0x000160a5\n\
  4584.    adds r2, r0\n\
  4585.    strb r3, [r2]\n\
  4586.    ldr r4, _0801F08C @ =gBattlescriptCurrInstr\n\
  4587.    ldr r0, [r4]\n\
  4588.    adds r0, 0x1\n\
  4589.    bl BattleScriptPush\n\
  4590.    ldr r0, _0801F090 @ =BattleScript_StatDown\n\
  4591.    b _0801F5F8\n\
  4592.    .align 2, 0\n\
  4593. _0801F080: .4byte gSharedMem\n\
  4594. _0801F084: .4byte 0x000160a4\n\
  4595. _0801F088: .4byte 0x000160a5\n\
  4596. _0801F08C: .4byte gBattlescriptCurrInstr\n\
  4597. _0801F090: .4byte BattleScript_StatDown\n\
  4598. _0801F094:\n\
  4599.    ldrb r1, [r7, 0x3]\n\
  4600.    adds r1, 0xDA\n\
  4601.    lsls r1, 24\n\
  4602.    lsrs r1, 24\n\
  4603.    movs r0, 0x20\n\
  4604.    adds r2, r6, 0\n\
  4605.    movs r3, 0\n\
  4606.    bl ChangeStatBuffs\n\
  4607.    lsls r0, 24\n\
  4608.    lsrs r3, r0, 24\n\
  4609.    cmp r3, 0\n\
  4610.    beq _0801F0B0\n\
  4611.    b _0801F5DC\n\
  4612. _0801F0B0:\n\
  4613.    ldr r2, _0801F0D4 @ =gSharedMem\n\
  4614.    ldrb r1, [r7, 0x3]\n\
  4615.    movs r0, 0x3F\n\
  4616.    ands r0, r1\n\
  4617.    ldr r4, _0801F0D8 @ =0x000160a4\n\
  4618.    adds r1, r2, r4\n\
  4619.    strb r0, [r1]\n\
  4620.    ldr r0, _0801F0DC @ =0x000160a5\n\
  4621.    adds r2, r0\n\
  4622.    strb r3, [r2]\n\
  4623.    ldr r4, _0801F0E0 @ =gBattlescriptCurrInstr\n\
  4624.    ldr r0, [r4]\n\
  4625.    adds r0, 0x1\n\
  4626.    bl BattleScriptPush\n\
  4627.    ldr r0, _0801F0E4 @ =BattleScript_StatUp\n\
  4628.    b _0801F5F8\n\
  4629.    .align 2, 0\n\
  4630. _0801F0D4: .4byte gSharedMem\n\
  4631. _0801F0D8: .4byte 0x000160a4\n\
  4632. _0801F0DC: .4byte 0x000160a5\n\
  4633. _0801F0E0: .4byte gBattlescriptCurrInstr\n\
  4634. _0801F0E4: .4byte BattleScript_StatUp\n\
  4635. _0801F0E8:\n\
  4636.    movs r0, 0x60\n\
  4637.    negs r0, r0\n\
  4638.    ldrb r1, [r7, 0x3]\n\
  4639.    adds r1, 0xD3\n\
  4640.    lsls r1, 24\n\
  4641.    lsrs r1, 24\n\
  4642.    adds r2, r6, 0\n\
  4643.    movs r3, 0\n\
  4644.    bl ChangeStatBuffs\n\
  4645.    lsls r0, 24\n\
  4646.    lsrs r3, r0, 24\n\
  4647.    cmp r3, 0\n\
  4648.    beq _0801F106\n\
  4649.    b _0801F5DC\n\
  4650. _0801F106:\n\
  4651.    ldr r2, _0801F128 @ =gSharedMem\n\
  4652.    ldrb r1, [r7, 0x3]\n\
  4653.    movs r0, 0x3F\n\
  4654.    ands r0, r1\n\
  4655.    ldr r4, _0801F12C @ =0x000160a4\n\
  4656.    adds r1, r2, r4\n\
  4657.    strb r0, [r1]\n\
  4658.    ldr r0, _0801F130 @ =0x000160a5\n\
  4659.    adds r2, r0\n\
  4660.    strb r3, [r2]\n\
  4661.    ldr r4, _0801F134 @ =gBattlescriptCurrInstr\n\
  4662.    ldr r0, [r4]\n\
  4663.    adds r0, 0x1\n\
  4664.    bl BattleScriptPush\n\
  4665.    ldr r0, _0801F138 @ =BattleScript_StatDown\n\
  4666.    b _0801F5F8\n\
  4667.    .align 2, 0\n\
  4668. _0801F128: .4byte gSharedMem\n\
  4669. _0801F12C: .4byte 0x000160a4\n\
  4670. _0801F130: .4byte 0x000160a5\n\
  4671. _0801F134: .4byte gBattlescriptCurrInstr\n\
  4672. _0801F138: .4byte BattleScript_StatDown\n\
  4673. _0801F13C:\n\
  4674.    mov r2, r8\n\
  4675.    ldrb r1, [r2]\n\
  4676.    movs r0, 0x58\n\
  4677.    adds r2, r1, 0\n\
  4678.    muls r2, r0\n\
  4679.    mov r0, r9\n\
  4680.    adds r0, 0x50\n\
  4681.    adds r2, r0\n\
  4682.    ldr r0, [r2]\n\
  4683.    movs r1, 0x80\n\
  4684.    lsls r1, 15\n\
  4685.    orrs r0, r1\n\
  4686.    str r0, [r2]\n\
  4687.    ldr r2, _0801F178 @ =gDisableStructs\n\
  4688.    mov r3, r8\n\
  4689.    ldrb r1, [r3]\n\
  4690.    lsls r0, r1, 3\n\
  4691.    subs r0, r1\n\
  4692.    lsls r0, 2\n\
  4693.    adds r0, r2\n\
  4694.    movs r1, 0x2\n\
  4695.    strb r1, [r0, 0x19]\n\
  4696.    ldr r1, _0801F17C @ =gLockedMoves\n\
  4697.    ldrb r0, [r3]\n\
  4698.    lsls r0, 1\n\
  4699.    adds r0, r1\n\
  4700.    ldr r1, _0801F180 @ =gCurrentMove\n\
  4701.    ldrh r1, [r1]\n\
  4702.    strh r1, [r0]\n\
  4703.    b _0801F5DC\n\
  4704.    .align 2, 0\n\
  4705. _0801F178: .4byte gDisableStructs\n\
  4706. _0801F17C: .4byte gLockedMoves\n\
  4707. _0801F180: .4byte gCurrentMove\n\
  4708. _0801F184:\n\
  4709.    ldr r0, _0801F1A0 @ =gBankAttacker\n\
  4710.    ldrb r1, [r0]\n\
  4711.    movs r0, 0x58\n\
  4712.    adds r2, r1, 0\n\
  4713.    muls r2, r0\n\
  4714.    mov r0, r9\n\
  4715.    adds r0, 0x50\n\
  4716.    adds r2, r0\n\
  4717.    ldr r0, [r2]\n\
  4718.    movs r1, 0x80\n\
  4719.    lsls r1, 16\n\
  4720. _0801F19A:\n\
  4721.    orrs r0, r1\n\
  4722.    str r0, [r2]\n\
  4723.    b _0801F5DC\n\
  4724.    .align 2, 0\n\
  4725. _0801F1A0: .4byte gBankAttacker\n\
  4726. _0801F1A4:\n\
  4727.    ldr r4, _0801F254 @ =gBankAttacker\n\
  4728.    ldrb r0, [r4]\n\
  4729.    bl GetBattlerSide\n\
  4730.    lsls r0, 24\n\
  4731.    lsrs r6, r0, 24\n\
  4732.    ldrb r0, [r4]\n\
  4733.    bl GetBattlerSide\n\
  4734.    lsls r0, 24\n\
  4735.    lsrs r0, 24\n\
  4736.    cmp r0, 0x1\n\
  4737.    bne _0801F1D8\n\
  4738.    ldr r0, _0801F258 @ =gBattleTypeFlags\n\
  4739.    ldrh r1, [r0]\n\
  4740.    ldr r0, _0801F25C @ =0x00000902\n\
  4741.    ands r0, r1\n\
  4742.    cmp r0, 0\n\
  4743.    bne _0801F214\n\
  4744.    ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\
  4745.    ldrh r1, [r0]\n\
  4746.    movs r0, 0x80\n\
  4747.    lsls r0, 3\n\
  4748.    cmp r1, r0\n\
  4749.    beq _0801F1D8\n\
  4750.    b _0801F5DC\n\
  4751. _0801F1D8:\n\
  4752.    ldr r0, _0801F258 @ =gBattleTypeFlags\n\
  4753.    ldrh r1, [r0]\n\
  4754.    ldr r0, _0801F25C @ =0x00000902\n\
  4755.    ands r0, r1\n\
  4756.    cmp r0, 0\n\
  4757.    bne _0801F214\n\
  4758.    ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\
  4759.    ldrh r1, [r0]\n\
  4760.    movs r0, 0x80\n\
  4761.    lsls r0, 3\n\
  4762.    cmp r1, r0\n\
  4763.    beq _0801F214\n\
  4764.    ldr r0, _0801F264 @ =gWishFutureKnock\n\
  4765.    adds r0, 0x29\n\
  4766.    adds r0, r6, r0\n\
  4767.    ldrb r1, [r0]\n\
  4768.    ldr r3, _0801F268 @ =gBitTable\n\
  4769.    ldr r2, _0801F26C @ =gBattlerPartyIndexes\n\
  4770.    ldr r0, _0801F254 @ =gBankAttacker\n\
  4771.    ldrb r0, [r0]\n\
  4772.    lsls r0, 1\n\
  4773.    adds r0, r2\n\
  4774.    ldrh r0, [r0]\n\
  4775.    lsls r0, 2\n\
  4776.    adds r0, r3\n\
  4777.    ldr r0, [r0]\n\
  4778.    ands r1, r0\n\
  4779.    cmp r1, 0\n\
  4780.    beq _0801F214\n\
  4781.    b _0801F5DC\n\
  4782. _0801F214:\n\
  4783.    ldr r2, _0801F270 @ =gBattleMons\n\
  4784.    ldr r1, _0801F274 @ =gBankTarget\n\
  4785.    ldrb r0, [r1]\n\
  4786.    movs r3, 0x58\n\
  4787.    muls r0, r3\n\
  4788.    adds r4, r0, r2\n\
  4789.    ldrh r0, [r4, 0x2E]\n\
  4790.    adds r7, r1, 0\n\
  4791.    mov r9, r2\n\
  4792.    cmp r0, 0\n\
  4793.    beq _0801F284\n\
  4794.    adds r0, r4, 0\n\
  4795.    adds r0, 0x20\n\
  4796.    ldrb r0, [r0]\n\
  4797.    cmp r0, 0x3C\n\
  4798.    bne _0801F284\n\
  4799.    ldr r1, _0801F278 @ =gBattlescriptCurrInstr\n\
  4800.    ldr r0, _0801F27C @ =BattleScript_NoItemSteal\n\
  4801.    str r0, [r1]\n\
  4802.    ldr r1, _0801F280 @ =gLastUsedAbility\n\
  4803.    ldrb r0, [r7]\n\
  4804.    muls r0, r3\n\
  4805.    add r0, r9\n\
  4806.    adds r0, 0x20\n\
  4807.    ldrb r0, [r0]\n\
  4808.    strb r0, [r1]\n\
  4809.    ldrb r0, [r7]\n\
  4810.    ldrb r1, [r1]\n\
  4811.    bl RecordAbilityBattle\n\
  4812.    b _0801F5FA\n\
  4813.    .align 2, 0\n\
  4814. _0801F254: .4byte gBankAttacker\n\
  4815. _0801F258: .4byte gBattleTypeFlags\n\
  4816. _0801F25C: .4byte 0x00000902\n\
  4817. _0801F260: .4byte gTrainerBattleOpponent\n\
  4818. _0801F264: .4byte gWishFutureKnock\n\
  4819. _0801F268: .4byte gBitTable\n\
  4820. _0801F26C: .4byte gBattlerPartyIndexes\n\
  4821. _0801F270: .4byte gBattleMons\n\
  4822. _0801F274: .4byte gBankTarget\n\
  4823. _0801F278: .4byte gBattlescriptCurrInstr\n\
  4824. _0801F27C: .4byte BattleScript_NoItemSteal\n\
  4825. _0801F280: .4byte gLastUsedAbility\n\
  4826. _0801F284:\n\
  4827.    ldr r4, _0801F340 @ =gBankAttacker\n\
  4828.    mov r10, r4\n\
  4829.    ldrb r1, [r4]\n\
  4830.    movs r0, 0x58\n\
  4831.    mov r8, r0\n\
  4832.    mov r0, r8\n\
  4833.    muls r0, r1\n\
  4834.    add r0, r9\n\
  4835.    ldrh r3, [r0, 0x2E]\n\
  4836.    cmp r3, 0\n\
  4837.    beq _0801F29C\n\
  4838.    b _0801F5DC\n\
  4839. _0801F29C:\n\
  4840.    ldrb r0, [r7]\n\
  4841.    mov r2, r8\n\
  4842.    muls r2, r0\n\
  4843.    adds r0, r2, 0\n\
  4844.    add r0, r9\n\
  4845.    ldrh r2, [r0, 0x2E]\n\
  4846.    adds r0, r2, 0\n\
  4847.    cmp r0, 0xAF\n\
  4848.    bne _0801F2B0\n\
  4849.    b _0801F5DC\n\
  4850. _0801F2B0:\n\
  4851.    cmp r0, 0\n\
  4852.    bne _0801F2B6\n\
  4853.    b _0801F5DC\n\
  4854. _0801F2B6:\n\
  4855.    lsls r0, r1, 1\n\
  4856.    ldr r5, _0801F344 @ =gSharedMem + 0x160F0\n\
  4857.    adds r0, r5\n\
  4858.    ldr r1, _0801F348 @ =gLastUsedItem\n\
  4859.    strh r2, [r0]\n\
  4860.    strh r2, [r1]\n\
  4861.    ldrb r0, [r7]\n\
  4862.    mov r4, r8\n\
  4863.    muls r4, r0\n\
  4864.    adds r0, r4, 0\n\
  4865.    add r0, r9\n\
  4866.    movs r6, 0\n\
  4867.    strh r3, [r0, 0x2E]\n\
  4868.    ldr r4, _0801F34C @ =gActiveBattler\n\
  4869.    mov r2, r10\n\
  4870.    ldrb r0, [r2]\n\
  4871.    strb r0, [r4]\n\
  4872.    str r1, [sp]\n\
  4873.    movs r0, 0\n\
  4874.    movs r1, 0x2\n\
  4875.    movs r2, 0\n\
  4876.    movs r3, 0x2\n\
  4877.    bl EmitSetMonData\n\
  4878.    mov r3, r10\n\
  4879.    ldrb r0, [r3]\n\
  4880.    bl MarkBufferBankForExecution\n\
  4881.    ldrb r0, [r7]\n\
  4882.    strb r0, [r4]\n\
  4883.    ldrb r0, [r7]\n\
  4884.    mov r4, r8\n\
  4885.    muls r4, r0\n\
  4886.    adds r0, r4, 0\n\
  4887.    mov r1, r9\n\
  4888.    adds r1, 0x2E\n\
  4889.    adds r0, r1\n\
  4890.    str r0, [sp]\n\
  4891.    movs r0, 0\n\
  4892.    movs r1, 0x2\n\
  4893.    movs r2, 0\n\
  4894.    movs r3, 0x2\n\
  4895.    bl EmitSetMonData\n\
  4896.    ldrb r0, [r7]\n\
  4897.    bl MarkBufferBankForExecution\n\
  4898.    ldr r4, _0801F350 @ =gBattlescriptCurrInstr\n\
  4899.    ldr r0, [r4]\n\
  4900.    adds r0, 0x1\n\
  4901.    bl BattleScriptPush\n\
  4902.    ldr r0, _0801F354 @ =BattleScript_ItemSteal\n\
  4903.    str r0, [r4]\n\
  4904.    ldr r0, _0801F358 @ =0xfffe9f10\n\
  4905.    adds r5, r0\n\
  4906.    ldrb r0, [r7]\n\
  4907.    lsls r0, 1\n\
  4908.    ldr r1, _0801F35C @ =0x000160e8\n\
  4909.    adds r0, r1\n\
  4910.    adds r0, r5\n\
  4911.    strb r6, [r0]\n\
  4912.    ldrb r0, [r7]\n\
  4913.    lsls r0, 1\n\
  4914.    ldr r2, _0801F360 @ =0x000160e9\n\
  4915.    adds r0, r2\n\
  4916.    adds r0, r5\n\
  4917.    strb r6, [r0]\n\
  4918.    b _0801F5FA\n\
  4919.    .align 2, 0\n\
  4920. _0801F340: .4byte gBankAttacker\n\
  4921. _0801F344: .4byte gSharedMem + 0x160F0\n\
  4922. _0801F348: .4byte gLastUsedItem\n\
  4923. _0801F34C: .4byte gActiveBattler\n\
  4924. _0801F350: .4byte gBattlescriptCurrInstr\n\
  4925. _0801F354: .4byte BattleScript_ItemSteal\n\
  4926. _0801F358: .4byte 0xfffe9f10\n\
  4927. _0801F35C: .4byte 0x000160e8\n\
  4928. _0801F360: .4byte 0x000160e9\n\
  4929. _0801F364:\n\
  4930.    ldr r3, _0801F394 @ =gBankTarget\n\
  4931.    ldrb r1, [r3]\n\
  4932.    movs r0, 0x58\n\
  4933.    adds r2, r1, 0\n\
  4934.    muls r2, r0\n\
  4935.    mov r0, r9\n\
  4936.    adds r0, 0x50\n\
  4937.    adds r2, r0\n\
  4938.    ldr r0, [r2]\n\
  4939.    movs r1, 0x80\n\
  4940.    lsls r1, 19\n\
  4941.    orrs r0, r1\n\
  4942.    str r0, [r2]\n\
  4943.    ldr r2, _0801F398 @ =gDisableStructs\n\
  4944.    ldrb r1, [r3]\n\
  4945.    lsls r0, r1, 3\n\
  4946.    subs r0, r1\n\
  4947.    lsls r0, 2\n\
  4948.    adds r0, r2\n\
  4949.    ldr r1, _0801F39C @ =gBankAttacker\n\
  4950.    ldrb r1, [r1]\n\
  4951.    strb r1, [r0, 0x14]\n\
  4952.    b _0801F5DC\n\
  4953.    .align 2, 0\n\
  4954. _0801F394: .4byte gBankTarget\n\
  4955. _0801F398: .4byte gDisableStructs\n\
  4956. _0801F39C: .4byte gBankAttacker\n\
  4957. _0801F3A0:\n\
  4958.    ldr r0, _0801F3B8 @ =gBankTarget\n\
  4959.    ldrb r1, [r0]\n\
  4960.    movs r0, 0x58\n\
  4961.    adds r2, r1, 0\n\
  4962.    muls r2, r0\n\
  4963.    mov r0, r9\n\
  4964.    adds r0, 0x50\n\
  4965.    adds r2, r0\n\
  4966.    ldr r0, [r2]\n\
  4967.    movs r1, 0x80\n\
  4968.    lsls r1, 20\n\
  4969.    b _0801F19A\n\
  4970.    .align 2, 0\n\
  4971. _0801F3B8: .4byte gBankTarget\n\
  4972. _0801F3BC:\n\
  4973.    ldr r4, _0801F3CC @ =gBattlescriptCurrInstr\n\
  4974.    ldr r0, [r4]\n\
  4975.    adds r0, 0x1\n\
  4976.    bl BattleScriptPush\n\
  4977.    ldr r0, _0801F3D0 @ =BattleScript_AllStatsUp\n\
  4978.    b _0801F5F8\n\
  4979.    .align 2, 0\n\
  4980. _0801F3CC: .4byte gBattlescriptCurrInstr\n\
  4981. _0801F3D0: .4byte BattleScript_AllStatsUp\n\
  4982. _0801F3D4:\n\
  4983.    ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\
  4984.    ldr r0, [r4]\n\
  4985.    adds r0, 0x1\n\
  4986.    bl BattleScriptPush\n\
  4987.    ldr r0, _0801F3E8 @ =BattleScript_RapidSpinAway\n\
  4988.    b _0801F5F8\n\
  4989.    .align 2, 0\n\
  4990. _0801F3E4: .4byte gBattlescriptCurrInstr\n\
  4991. _0801F3E8: .4byte BattleScript_RapidSpinAway\n\
  4992. _0801F3EC:\n\
  4993.    ldr r6, _0801F43C @ =gBankTarget\n\
  4994.    ldrb r0, [r6]\n\
  4995.    movs r2, 0x58\n\
  4996.    muls r0, r2\n\
  4997.    mov r1, r9\n\
  4998.    adds r1, 0x4C\n\
  4999.    adds r5, r0, r1\n\
  5000.    ldr r4, [r5]\n\
  5001.    movs r0, 0x40\n\
  5002.    ands r0, r4\n\
  5003.    cmp r0, 0\n\
  5004.    bne _0801F406\n\
  5005.    b _0801F5DC\n\
  5006. _0801F406:\n\
  5007.    movs r0, 0x41\n\
  5008.    negs r0, r0\n\
  5009.    ands r4, r0\n\
  5010.    str r4, [r5]\n\
  5011.    ldr r4, _0801F440 @ =gActiveBattler\n\
  5012.    ldrb r0, [r6]\n\
  5013.    strb r0, [r4]\n\
  5014.    ldrb r0, [r4]\n\
  5015.    muls r0, r2\n\
  5016.    adds r0, r1\n\
  5017.    str r0, [sp]\n\
  5018.    movs r0, 0\n\
  5019.    movs r1, 0x28\n\
  5020.    movs r2, 0\n\
  5021.    movs r3, 0x4\n\
  5022.    bl EmitSetMonData\n\
  5023.    ldrb r0, [r4]\n\
  5024.    bl MarkBufferBankForExecution\n\
  5025.    ldr r4, _0801F444 @ =gBattlescriptCurrInstr\n\
  5026.    ldr r0, [r4]\n\
  5027.    adds r0, 0x1\n\
  5028.    bl BattleScriptPush\n\
  5029.    ldr r0, _0801F448 @ =BattleScript_TargetPRLZHeal\n\
  5030.    b _0801F5F8\n\
  5031.    .align 2, 0\n\
  5032. _0801F43C: .4byte gBankTarget\n\
  5033. _0801F440: .4byte gActiveBattler\n\
  5034. _0801F444: .4byte gBattlescriptCurrInstr\n\
  5035. _0801F448: .4byte BattleScript_TargetPRLZHeal\n\
  5036. _0801F44C:\n\
  5037.    ldr r4, _0801F45C @ =gBattlescriptCurrInstr\n\
  5038.    ldr r0, [r4]\n\
  5039.    adds r0, 0x1\n\
  5040.    bl BattleScriptPush\n\
  5041.    ldr r0, _0801F460 @ =BattleScript_AtkDefDown\n\
  5042.    b _0801F5F8\n\
  5043.    .align 2, 0\n\
  5044. _0801F45C: .4byte gBattlescriptCurrInstr\n\
  5045. _0801F460: .4byte BattleScript_AtkDefDown\n\
  5046. _0801F464:\n\
  5047.    ldr r4, _0801F494 @ =gBattleMoveDamage\n\
  5048.    ldr r0, _0801F498 @ =gHpDealt\n\
  5049.    ldr r0, [r0]\n\
  5050.    movs r1, 0x3\n\
  5051.    bl __divsi3\n\
  5052.    str r0, [r4]\n\
  5053.    cmp r0, 0\n\
  5054.    bne _0801F47A\n\
  5055.    movs r0, 0x1\n\
  5056.    str r0, [r4]\n\
  5057. _0801F47A:\n\
  5058.    ldr r4, _0801F49C @ =gBattlescriptCurrInstr\n\
  5059.    ldr r0, [r4]\n\
  5060.    adds r0, 0x1\n\
  5061.    bl BattleScriptPush\n\
  5062.    ldr r1, _0801F4A0 @ =gMoveEffectBS_Ptrs\n\
  5063.    ldr r0, _0801F4A4 @ =gBattleCommunication\n\
  5064.    ldrb r0, [r0, 0x3]\n\
  5065.    lsls r0, 2\n\
  5066.    adds r0, r1\n\
  5067.    ldr r0, [r0]\n\
  5068.    b _0801F5F8\n\
  5069.    .align 2, 0\n\
  5070. _0801F494: .4byte gBattleMoveDamage\n\
  5071. _0801F498: .4byte gHpDealt\n\
  5072. _0801F49C: .4byte gBattlescriptCurrInstr\n\
  5073. _0801F4A0: .4byte gMoveEffectBS_Ptrs\n\
  5074. _0801F4A4: .4byte gBattleCommunication\n\
  5075. _0801F4A8:\n\
  5076.    mov r3, r8\n\
  5077.    ldrb r0, [r3]\n\
  5078.    movs r5, 0x58\n\
  5079.    muls r0, r5\n\
  5080.    mov r4, r9\n\
  5081.    adds r4, 0x50\n\
  5082.    adds r2, r0, r4\n\
  5083.    ldr r1, [r2]\n\
  5084.    movs r0, 0xC0\n\
  5085.    lsls r0, 4\n\
  5086.    ands r0, r1\n\
  5087.    cmp r0, 0\n\
  5088.    beq _0801F4C4\n\
  5089.    b _0801F5DC\n\
  5090. _0801F4C4:\n\
  5091.    movs r0, 0x80\n\
  5092.    lsls r0, 5\n\
  5093.    orrs r1, r0\n\
  5094.    str r1, [r2]\n\
  5095.    ldr r1, _0801F4F8 @ =gLockedMoves\n\
  5096.    ldrb r0, [r3]\n\
  5097.    lsls r0, 1\n\
  5098.    adds r0, r1\n\
  5099.    ldr r1, _0801F4FC @ =gCurrentMove\n\
  5100.    ldrh r1, [r1]\n\
  5101.    strh r1, [r0]\n\
  5102.    bl Random\n\
  5103.    mov r2, r8\n\
  5104.    ldrb r1, [r2]\n\
  5105.    adds r2, r1, 0\n\
  5106.    muls r2, r5\n\
  5107.    adds r2, r4\n\
  5108.    movs r1, 0x1\n\
  5109.    ands r1, r0\n\
  5110.    adds r1, 0x2\n\
  5111.    lsls r1, 10\n\
  5112.    ldr r0, [r2]\n\
  5113. _0801F4F2:\n\
  5114.    orrs r0, r1\n\
  5115.    str r0, [r2]\n\
  5116.    b _0801F5FA\n\
  5117.    .align 2, 0\n\
  5118. _0801F4F8: .4byte gLockedMoves\n\
  5119. _0801F4FC: .4byte gCurrentMove\n\
  5120. _0801F500:\n\
  5121.    mov r5, r8\n\
  5122.    ldrb r3, [r5]\n\
  5123.    movs r4, 0x58\n\
  5124.    adds r0, r3, 0\n\
  5125.    muls r0, r4\n\
  5126.    mov r2, r9\n\
  5127.    adds r1, r0, r2\n\
  5128.    adds r0, r1, 0\n\
  5129.    adds r0, 0x20\n\
  5130.    ldrb r2, [r0]\n\
  5131.    cmp r2, 0x3C\n\
  5132.    bne _0801F540\n\
  5133.    ldrh r0, [r1, 0x2E]\n\
  5134.    cmp r0, 0\n\
  5135.    beq _0801F5DC\n\
  5136.    ldr r0, _0801F534 @ =gLastUsedAbility\n\
  5137.    strb r2, [r0]\n\
  5138.    ldr r1, _0801F538 @ =gBattlescriptCurrInstr\n\
  5139.    ldr r0, _0801F53C @ =BattleScript_NoItemSteal\n\
  5140.    str r0, [r1]\n\
  5141.    ldrb r0, [r5]\n\
  5142.    movs r1, 0x3C\n\
  5143.    bl RecordAbilityBattle\n\
  5144.    b _0801F5FA\n\
  5145.    .align 2, 0\n\
  5146. _0801F534: .4byte gLastUsedAbility\n\
  5147. _0801F538: .4byte gBattlescriptCurrInstr\n\
  5148. _0801F53C: .4byte BattleScript_NoItemSteal\n\
  5149. _0801F540:\n\
  5150.    ldrh r0, [r1, 0x2E]\n\
  5151.    cmp r0, 0\n\
  5152.    beq _0801F5DC\n\
  5153.    adds r0, r3, 0\n\
  5154.    bl GetBattlerSide\n\
  5155.    lsls r0, 24\n\
  5156.    lsrs r6, r0, 24\n\
  5157.    ldr r1, _0801F5B8 @ =gLastUsedItem\n\
  5158.    mov r3, r8\n\
  5159.    ldrb r0, [r3]\n\
  5160.    muls r0, r4\n\
  5161.    add r0, r9\n\
  5162.    ldrh r0, [r0, 0x2E]\n\
  5163.    strh r0, [r1]\n\
  5164.    ldrb r0, [r3]\n\
  5165.    muls r0, r4\n\
  5166.    add r0, r9\n\
  5167.    movs r5, 0\n\
  5168.    movs r1, 0\n\
  5169.    strh r1, [r0, 0x2E]\n\
  5170.    ldr r2, _0801F5BC @ =gWishFutureKnock\n\
  5171.    adds r2, 0x29\n\
  5172.    adds r2, r6, r2\n\
  5173.    ldr r3, _0801F5C0 @ =gBitTable\n\
  5174.    ldr r1, _0801F5C4 @ =gBattlerPartyIndexes\n\
  5175.    mov r4, r8\n\
  5176.    ldrb r0, [r4]\n\
  5177.    lsls r0, 1\n\
  5178.    adds r0, r1\n\
  5179.    ldrh r0, [r0]\n\
  5180.    lsls r0, 2\n\
  5181.    adds r0, r3\n\
  5182.    ldr r0, [r0]\n\
  5183.    ldrb r1, [r2]\n\
  5184.    orrs r0, r1\n\
  5185.    strb r0, [r2]\n\
  5186.    ldr r4, _0801F5C8 @ =gBattlescriptCurrInstr\n\
  5187.    ldr r0, [r4]\n\
  5188.    adds r0, 0x1\n\
  5189.    bl BattleScriptPush\n\
  5190.    ldr r0, _0801F5CC @ =BattleScript_KnockedOff\n\
  5191.    str r0, [r4]\n\
  5192.    ldr r1, _0801F5D0 @ =gSharedMem\n\
  5193.    mov r2, r8\n\
  5194.    ldrb r0, [r2]\n\
  5195.    lsls r0, 1\n\
  5196.    ldr r3, _0801F5D4 @ =0x000160e8\n\
  5197.    adds r0, r3\n\
  5198.    adds r0, r1\n\
  5199.    strb r5, [r0]\n\
  5200.    ldrb r0, [r2]\n\
  5201.    lsls r0, 1\n\
  5202.    ldr r4, _0801F5D8 @ =0x000160e9\n\
  5203.    adds r0, r4\n\
  5204.    adds r0, r1\n\
  5205.    strb r5, [r0]\n\
  5206.    b _0801F5FA\n\
  5207.    .align 2, 0\n\
  5208. _0801F5B8: .4byte gLastUsedItem\n\
  5209. _0801F5BC: .4byte gWishFutureKnock\n\
  5210. _0801F5C0: .4byte gBitTable\n\
  5211. _0801F5C4: .4byte gBattlerPartyIndexes\n\
  5212. _0801F5C8: .4byte gBattlescriptCurrInstr\n\
  5213. _0801F5CC: .4byte BattleScript_KnockedOff\n\
  5214. _0801F5D0: .4byte gSharedMem\n\
  5215. _0801F5D4: .4byte 0x000160e8\n\
  5216. _0801F5D8: .4byte 0x000160e9\n\
  5217. _0801F5DC:\n\
  5218.    ldr r1, _0801F5E8 @ =gBattlescriptCurrInstr\n\
  5219.    ldr r0, [r1]\n\
  5220.    adds r0, 0x1\n\
  5221.    str r0, [r1]\n\
  5222.    b _0801F5FA\n\
  5223.    .align 2, 0\n\
  5224. _0801F5E8: .4byte gBattlescriptCurrInstr\n\
  5225. _0801F5EC:\n\
  5226.    ldr r4, _0801F60C @ =gBattlescriptCurrInstr\n\
  5227.    ldr r0, [r4]\n\
  5228.    adds r0, 0x1\n\
  5229.    bl BattleScriptPush\n\
  5230.    ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\
  5231. _0801F5F8:\n\
  5232.    str r0, [r4]\n\
  5233. _0801F5FA:\n\
  5234.    add sp, 0x8\n\
  5235.    pop {r3-r5}\n\
  5236.    mov r8, r3\n\
  5237.    mov r9, r4\n\
  5238.    mov r10, r5\n\
  5239.    pop {r4-r7}\n\
  5240.    pop {r0}\n\
  5241.    bx r0\n\
  5242.    .align 2, 0\n\
  5243. _0801F60C: .4byte gBattlescriptCurrInstr\n\
  5244. _0801F610: .4byte BattleScript_SAtkDown2\n\
  5245.        .syntax divided\n");
  5246. }
  5247. #endif // NONMATCHING
  5248.  
  5249. static void atk15_seteffectwithchance(void)
  5250. {
  5251.     u32 PercentChance;
  5252.  
  5253.     if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE)
  5254.         PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2;
  5255.     else
  5256.         PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance;
  5257.  
  5258.     if (DEBUG && (gUnknown_02023A14_50 & 4)
  5259.      && !(gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  5260.     {
  5261.         SetMoveEffect(0, 0);
  5262.     }
  5263.     else if ((gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  5264.     {
  5265.         gBattleCommunication[MOVE_EFFECT_BYTE] &= 0x7F;
  5266.         SetMoveEffect(0, 0x80);
  5267.     }
  5268.     else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] != 0 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  5269.     {
  5270.         if (PercentChance >= 100)
  5271.             SetMoveEffect(0, 0x80);
  5272.         else
  5273.             SetMoveEffect(0, 0);
  5274.     }
  5275.     else
  5276.     {
  5277.         gBattlescriptCurrInstr++;
  5278.     }
  5279.  
  5280.     gBattleCommunication[MOVE_EFFECT_BYTE] = 0;
  5281.     gBattleStruct->unk16112 = 0;
  5282. }
  5283.  
  5284. static void atk16_seteffectprimary(void)
  5285. {
  5286.     SetMoveEffect(1, 0);
  5287. }
  5288.  
  5289. static void atk17_seteffectsecondary(void)
  5290. {
  5291.     SetMoveEffect(0, 0);
  5292. }
  5293.  
  5294. static void atk18_clearstatusfromeffect(void)
  5295. {
  5296.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5297.     if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6)
  5298.         gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);
  5299.     else
  5300.         gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);
  5301.  
  5302.     gBattleCommunication[MOVE_EFFECT_BYTE] = 0;
  5303.     gBattlescriptCurrInstr += 2;
  5304.     gBattleStruct->unk16112 = 0;
  5305. }
  5306.  
  5307. static void atk19_tryfaintmon(void)
  5308. {
  5309.     u8 *r4;
  5310.  
  5311.     if (gBattlescriptCurrInstr[2] != 0)
  5312.     {
  5313.         gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]);
  5314.         if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))
  5315.         {
  5316.             r4 = T1_READ_PTR(gBattlescriptCurrInstr + 3);
  5317.  
  5318.             BattleScriptPop();
  5319.             gBattlescriptCurrInstr = r4;
  5320.             gSideAffecting[GetBattlerSide(gActiveBattler)] &= ~SIDE_STATUS_SPIKES_DAMAGED;
  5321.         }
  5322.         else
  5323.         {
  5324.             gBattlescriptCurrInstr += 7;
  5325.         }
  5326.     }
  5327.     else
  5328.     {
  5329.         u8 bank;
  5330.  
  5331.         if (gBattlescriptCurrInstr[1] == 1)
  5332.         {
  5333.             gActiveBattler = gBankAttacker;
  5334.             bank = gBankTarget;
  5335.             r4 = BattleScript_FaintAttacker;
  5336.         }
  5337.         else
  5338.         {
  5339.             gActiveBattler = gBankTarget;
  5340.             bank = gBankAttacker;
  5341.             r4 = BattleScript_FaintTarget;
  5342.         }
  5343.         if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])
  5344.          && gBattleMons[gActiveBattler].hp == 0)
  5345.         {
  5346.             ewram160ACarr2(0, bank) = 0;
  5347.             ewram160ACarr2(1, bank) = 0;
  5348.             ewram16100arr2(0, bank) = 0;
  5349.             ewram16100arr2(1, bank) = 0;
  5350.             ewram16100arr2(2, bank) = 0;
  5351.             ewram16100arr2(3, bank) = 0;
  5352.  
  5353.             gHitMarker |= HITMARKER_FAINTED(gActiveBattler);
  5354.             BattleScriptPush(gBattlescriptCurrInstr + 7);
  5355.             gBattlescriptCurrInstr = r4;
  5356.             if (GetBattlerSide(gActiveBattler) == 0)
  5357.             {
  5358.                 gHitMarker |= HITMARKER_x400000;
  5359.                 if (gBattleResults.playerFaintCounter < 0xFF)
  5360.                     gBattleResults.playerFaintCounter++;
  5361.                 if (gBattleMons[bank].level > gBattleMons[gActiveBattler].level)
  5362.                 {
  5363.                     if (gBattleMons[bank].level - gBattleMons[gActiveBattler].level > 29)
  5364.                         AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], FRIENDSHIP_EVENT_FAINT_LARGE);
  5365.                     else
  5366.                         AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], FRIENDSHIP_EVENT_FAINT_SMALL);
  5367.                 }
  5368.             }
  5369.             else
  5370.             {
  5371.                 if (gBattleResults.opponentFaintCounter < 0xFF)
  5372.                     gBattleResults.opponentFaintCounter++;
  5373.                 gBattleResults.lastOpponentSpecies = gBattleMons[gActiveBattler].species;
  5374.             }
  5375.             if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0)
  5376.             {
  5377.                 BattleScriptPush(gBattlescriptCurrInstr);
  5378.                 gBattleMoveDamage = gBattleMons[bank].hp;
  5379.                 gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife;
  5380.             }
  5381.             if ((gStatuses3[gBankTarget] & STATUS3_GRUDGE)
  5382.              && !(gHitMarker & HITMARKER_GRUDGE)
  5383.              && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget)
  5384.              && gBattleMons[gBankAttacker].hp != 0
  5385.              && gCurrentMove != MOVE_STRUGGLE)
  5386.             {
  5387.                 u8 moveIndex = ewram1608Carr(gBankAttacker);
  5388.  
  5389.                 gBattleMons[gBankAttacker].pp[moveIndex] = 0;
  5390.                 BattleScriptPush(gBattlescriptCurrInstr);
  5391.                 gBattlescriptCurrInstr = BattleScript_SelectingImprisionedMoveInPalace;
  5392.                 gActiveBattler = gBankAttacker;
  5393.                 EmitSetMonData(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]);
  5394.                 MarkBufferBankForExecution(gActiveBattler);
  5395.  
  5396.                 gBattleTextBuff1[0] = 0xFD;
  5397.                 gBattleTextBuff1[1] = 2;
  5398.                 gBattleTextBuff1[2] = gBattleMons[gBankAttacker].moves[moveIndex];
  5399.                 gBattleTextBuff1[3] = gBattleMons[gBankAttacker].moves[moveIndex] >> 8;
  5400.                 gBattleTextBuff1[4] = EOS;
  5401.             }
  5402.         }
  5403.         else
  5404.         {
  5405.             gBattlescriptCurrInstr += 7;
  5406.         }
  5407.     }
  5408. }
  5409.  
  5410. static void atk1A_dofaintanimation(void)
  5411. {
  5412.     if (gBattleExecBuffer == 0)
  5413.     {
  5414.         gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5415.         Emitcmd10(0);
  5416.         MarkBufferBankForExecution(gActiveBattler);
  5417.         gBattlescriptCurrInstr += 2;
  5418.     }
  5419. }
  5420.  
  5421. static void atk1B_cleareffectsonfaint(void)
  5422. {
  5423.     //Clears things like attraction or trapping to other banks
  5424.     if (gBattleExecBuffer == 0)
  5425.     {
  5426.         gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5427.         gBattleMons[gActiveBattler].status1 = 0;
  5428.         EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBattler].status1);
  5429.         MarkBufferBankForExecution(gActiveBattler);
  5430.         UndoEffectsAfterFainting();
  5431.         gBattlescriptCurrInstr += 2;
  5432.     }
  5433. }
  5434.  
  5435. static void atk1C_jumpifstatus(void)
  5436. {
  5437.     u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5438.     u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2);
  5439.     void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 6);
  5440.     if (gBattleMons[bank].status1 & flags && gBattleMons[bank].hp)
  5441.         gBattlescriptCurrInstr = jump_loc;
  5442.     else
  5443.         gBattlescriptCurrInstr += 10;
  5444. }
  5445.  
  5446. static void atk1D_jumpifstatus2(void)
  5447. {
  5448.     u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5449.     u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2);
  5450.     void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 6);
  5451.     if (gBattleMons[bank].status2 & flags && gBattleMons[bank].hp)
  5452.         gBattlescriptCurrInstr = jump_loc;
  5453.     else
  5454.         gBattlescriptCurrInstr += 10;
  5455. }
  5456.  
  5457. static void atk1E_jumpifability(void)
  5458. {
  5459.     u8 bank;
  5460.     u8 ability = T2_READ_8(gBattlescriptCurrInstr + 2);
  5461.     void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 3);
  5462.     if (T2_READ_8(gBattlescriptCurrInstr + 1) == 8)
  5463.     {
  5464.         bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_BANK_SIDE, gBankAttacker, ability, 0, 0);
  5465.         if (bank)
  5466.         {
  5467.             gLastUsedAbility = ability;
  5468.             gBattlescriptCurrInstr = jump_loc;
  5469.             RecordAbilityBattle(bank -1, gLastUsedAbility);
  5470.             ewram160F8 = bank - 1;
  5471.         }
  5472.         else
  5473.             gBattlescriptCurrInstr += 7;
  5474.     }
  5475.     else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 9)
  5476.     {
  5477.         bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBankAttacker, ability, 0, 0);
  5478.         if (bank)
  5479.         {
  5480.             gLastUsedAbility = ability;
  5481.             gBattlescriptCurrInstr = jump_loc;
  5482.             RecordAbilityBattle(bank - 1, gLastUsedAbility);
  5483.             ewram160F8 = bank - 1;
  5484.         }
  5485.         else
  5486.             gBattlescriptCurrInstr += 7;
  5487.     }
  5488.     else
  5489.     {
  5490.         bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5491.         if (gBattleMons[bank].ability == ability)
  5492.         {
  5493.             gLastUsedAbility = ability;
  5494.             gBattlescriptCurrInstr = jump_loc;
  5495.             RecordAbilityBattle(bank, gLastUsedAbility);
  5496.             ewram160F8 = bank;
  5497.         }
  5498.         else
  5499.             gBattlescriptCurrInstr += 7;
  5500.     }
  5501. }
  5502.  
  5503. static void atk1F_jumpifsideaffecting(void)
  5504. {
  5505.     u8 side;
  5506.     u16 flags;
  5507.     void* jump_loc;
  5508.     if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1)
  5509.         side = GetBattlerPosition(gBankAttacker) & 1;
  5510.     else
  5511.         side = GetBattlerPosition(gBankTarget) & 1;
  5512.  
  5513.     flags = T2_READ_16(gBattlescriptCurrInstr + 2);
  5514.     jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 4);
  5515.  
  5516.     if (gSideAffecting[side] & flags)
  5517.         gBattlescriptCurrInstr = jump_loc;
  5518.     else
  5519.         gBattlescriptCurrInstr += 8;
  5520. }
  5521.  
  5522. static void atk20_jumpifstat(void)
  5523. {
  5524.     u8 ret = 0;
  5525.     u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5526.     u8 value = gBattleMons[bank].statStages[T2_READ_8(gBattlescriptCurrInstr + 3)];
  5527.     switch (T2_READ_8(gBattlescriptCurrInstr + 2))
  5528.     {
  5529.     case CMP_EQUAL:
  5530.         if (value == T2_READ_8(gBattlescriptCurrInstr + 4))
  5531.             ret++;
  5532.         break;
  5533.     case CMP_NOT_EQUAL:
  5534.         if (value != T2_READ_8(gBattlescriptCurrInstr + 4))
  5535.             ret++;
  5536.         break;
  5537.     case CMP_GREATER_THAN:
  5538.         if (value > T2_READ_8(gBattlescriptCurrInstr + 4))
  5539.             ret++;
  5540.         break;
  5541.     case CMP_LESS_THAN:
  5542.         if (value < T2_READ_8(gBattlescriptCurrInstr + 4))
  5543.             ret++;
  5544.         break;
  5545.     case CMP_COMMON_BITS:
  5546.         if (value & T2_READ_8(gBattlescriptCurrInstr + 4))
  5547.             ret++;
  5548.         break;
  5549.     case CMP_NO_COMMON_BITS:
  5550.         if (!(value & T2_READ_8(gBattlescriptCurrInstr + 4)))
  5551.             ret++;
  5552.         break;
  5553.     }
  5554.     if (ret)
  5555.         gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 5);
  5556.     else
  5557.         gBattlescriptCurrInstr += 9;
  5558. }
  5559.  
  5560. static void atk21_jumpifstatus3condition(void)
  5561. {
  5562.     u32 flags;
  5563.     void* jump_loc;
  5564.  
  5565.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5566.     flags = T2_READ_32(gBattlescriptCurrInstr + 2);
  5567.     jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 7);
  5568.     if (T2_READ_8(gBattlescriptCurrInstr + 6))
  5569.     {
  5570.         if ((gStatuses3[gActiveBattler] & flags) != 0)
  5571.             gBattlescriptCurrInstr += 11;
  5572.         else
  5573.             gBattlescriptCurrInstr = jump_loc;
  5574.     }
  5575.     else
  5576.     {
  5577.         if ((gStatuses3[gActiveBattler] & flags) != 0)
  5578.             gBattlescriptCurrInstr = jump_loc;
  5579.         else
  5580.             gBattlescriptCurrInstr += 11;
  5581.     }
  5582. }
  5583.  
  5584. static void atk22_jumpiftype(void) //u8 bank, u8 type, *ptr
  5585. {
  5586.     u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  5587.     u8 type = T2_READ_8(gBattlescriptCurrInstr + 2);
  5588.     void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 3);
  5589.  
  5590.     if (gBattleMons[bank].type1 == type || gBattleMons[bank].type2 == type)
  5591.         gBattlescriptCurrInstr = jump_loc;
  5592.     else
  5593.         gBattlescriptCurrInstr += 7;
  5594. }
  5595.  
  5596. static void atk23_getexp(void)
  5597. {
  5598.     u16 item;
  5599.     s32 i; // also used as stringId
  5600.     u8 holdEffect;
  5601.     s32 sentIn;
  5602.  
  5603.     s32 viaExpShare = 0;
  5604.     u16* exp = &gBattleStruct->exp;
  5605.  
  5606.     gBank1 = GetBattleBank(gBattlescriptCurrInstr[1]);
  5607.     sentIn = gSentPokesToOpponent[(gBank1 & 2) >> 1];
  5608.  
  5609.     switch (gBattleStruct->getexpStateTracker)
  5610.     {
  5611.     case 0: // check if should receive exp at all
  5612.         if (GetBattlerSide(gBank1) != B_SIDE_OPPONENT || (gBattleTypeFlags &
  5613.              (BATTLE_TYPE_LINK
  5614.               | BATTLE_TYPE_SAFARI
  5615.               | BATTLE_TYPE_BATTLE_TOWER
  5616.               | BATTLE_TYPE_EREADER_TRAINER)))
  5617.         {
  5618.             gBattleStruct->getexpStateTracker = 6; // goto last case
  5619.         }
  5620.         else
  5621.         {
  5622.             gBattleStruct->getexpStateTracker++;
  5623.             gBattleStruct->unk16113 |= gBitTable[gBattlerPartyIndexes[gBank1]];
  5624.         }
  5625.         break;
  5626.     case 1: // calculate experience points to redistribute
  5627.         {
  5628.             u16 calculatedExp;
  5629.             s32 viaSentIn;
  5630.  
  5631.             for (viaSentIn = 0, i = 0; i < 6; i++)
  5632.             {
  5633.                 if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
  5634.                     continue;
  5635.                 if (gBitTable[i] & sentIn)
  5636.                     viaSentIn++;
  5637.  
  5638.                 item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
  5639.  
  5640.                 if (item == ITEM_ENIGMA_BERRY)
  5641.                     holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
  5642.                 else
  5643.                     holdEffect = ItemId_GetHoldEffect(item);
  5644.  
  5645.                 if (holdEffect == HOLD_EFFECT_EXP_SHARE)
  5646.                     viaExpShare++;
  5647.             }
  5648.  
  5649.             calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7;
  5650.  
  5651.             if (viaExpShare) // at least one mon is getting exp via exp share
  5652.             {
  5653.                 *exp = calculatedExp / 2 / viaSentIn;
  5654.                 if (*exp == 0)
  5655.                     *exp = 1;
  5656.  
  5657.                 gExpShareExp = calculatedExp / 2 / viaExpShare;
  5658.                 if (gExpShareExp == 0)
  5659.                     gExpShareExp = 1;
  5660.             }
  5661.             else
  5662.             {
  5663.                 *exp = calculatedExp / viaSentIn;
  5664.                 if (*exp == 0)
  5665.                     *exp = 1;
  5666.                 gExpShareExp = 0;
  5667.             }
  5668.  
  5669.             gBattleStruct->getexpStateTracker++;
  5670.             gBattleStruct->expGetterID = 0;
  5671.             gBattleStruct->sentInPokes = sentIn;
  5672.         }
  5673.         // fall through
  5674.     case 2: // set exp value to the poke in expgetter_id and print message
  5675.         if (gBattleExecBuffer == 0)
  5676.         {
  5677.             item = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HELD_ITEM);
  5678.  
  5679.             if (item == ITEM_ENIGMA_BERRY)
  5680.                 holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
  5681.             else
  5682.                 holdEffect = ItemId_GetHoldEffect(item);
  5683.  
  5684.             if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1))
  5685.             {
  5686.                 gBattleStruct->sentInPokes >>= 1;
  5687.                 gBattleStruct->getexpStateTracker = 5;
  5688.                 gBattleMoveDamage = 0; // used for exp
  5689.             }
  5690.             else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) == 100)
  5691.             {
  5692.                 gBattleStruct->sentInPokes >>= 1;
  5693.                 gBattleStruct->getexpStateTracker = 5;
  5694.                 gBattleMoveDamage = 0; // used for exp
  5695.             }
  5696.             else
  5697.             {
  5698.                 // music change in wild battle after fainting a poke
  5699.                 if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong)
  5700.                 {
  5701.                     BattleStopLowHpSound();
  5702.                     PlayBGM(0x161);
  5703.                     gBattleStruct->wildVictorySong++;
  5704.                 }
  5705.  
  5706.                 if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP))
  5707.                 {
  5708.                     if (gBattleStruct->sentInPokes & 1)
  5709.                         gBattleMoveDamage = *exp;
  5710.                     else
  5711.                         gBattleMoveDamage = 0;
  5712.  
  5713.                     if (holdEffect == HOLD_EFFECT_EXP_SHARE)
  5714.                         gBattleMoveDamage += gExpShareExp;
  5715.                     if (holdEffect == HOLD_EFFECT_LUCKY_EGG)
  5716.                         gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  5717.                     if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
  5718.                         gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  5719.  
  5720.                     if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterID]))
  5721.                     {
  5722.                         gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  5723.                         i = 0x14A;
  5724.                     }
  5725.                     else
  5726.                     {
  5727.                         i = 0x149;
  5728.                     }
  5729.  
  5730.                     // get exp getter bank
  5731.                     if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  5732.                     {
  5733.                         if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterID) && !(gAbsentBattlerFlags & gBitTable[2]))
  5734.                             gBattleStruct->expGetterBank = 2;
  5735.                         else
  5736.                         {
  5737.                             if (!(gAbsentBattlerFlags & gBitTable[0]))
  5738.                                 gBattleStruct->expGetterBank = 0;
  5739.                             else
  5740.                                 gBattleStruct->expGetterBank = 2;
  5741.                         }
  5742.                     }
  5743.                     else
  5744.                         gBattleStruct->expGetterBank = 0;
  5745.  
  5746.                     PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBank, gBattleStruct->expGetterID)
  5747.  
  5748.                     // buffer 'gained' or 'gained a boosted'
  5749.                     PREPARE_STRING_BUFFER(gBattleTextBuff2, i)
  5750.  
  5751.                     PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage)
  5752.  
  5753.                     PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBank);
  5754.                     MonGainEVs(&gPlayerParty[gBattleStruct->expGetterID], gBattleMons[gBank1].species);
  5755.                 }
  5756.                 gBattleStruct->sentInPokes >>= 1;
  5757.                 gBattleStruct->getexpStateTracker++;
  5758.             }
  5759.         }
  5760.         break;
  5761.     case 3: // Set stats and give exp
  5762.         if (gBattleExecBuffer == 0)
  5763.         {
  5764.             gBattleBufferB[gBattleStruct->expGetterBank][0] = 0;
  5765.             if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) != 100)
  5766.             {
  5767.                 gBattleResources_statsBeforeLvlUp->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
  5768.                 gBattleResources_statsBeforeLvlUp->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
  5769.                 gBattleResources_statsBeforeLvlUp->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
  5770.                 gBattleResources_statsBeforeLvlUp->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  5771.                 gBattleResources_statsBeforeLvlUp->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
  5772.                 gBattleResources_statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF);
  5773.                
  5774.                 gActiveBattler = gBattleStruct->expGetterBank;
  5775.  
  5776.                 EmitExpBarUpdate(0, gBattleStruct->expGetterID, gBattleMoveDamage);
  5777.                 MarkBufferBankForExecution(gActiveBattler);
  5778.             }
  5779.             gBattleStruct->getexpStateTracker++;
  5780.         }
  5781.         break;
  5782.     case 4: // lvl up if necessary
  5783.         if (gBattleExecBuffer == 0)
  5784.         {
  5785.             gActiveBattler = gBattleStruct->expGetterBank;
  5786.             if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES
  5787.              && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELLED_UP)
  5788.             {
  5789.                 if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID)
  5790.                     HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
  5791.  
  5792.                 PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattleStruct->expGetterID)
  5793.  
  5794.                 PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL))
  5795.  
  5796.                 BattleScriptPushCursor();
  5797.                 gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterID];
  5798.                 gBattlescriptCurrInstr = BattleScript_LevelUp;
  5799.                 gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8));
  5800.                 AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterID], FRIENDSHIP_EVENT_GROW_LEVEL);
  5801.  
  5802.                 // update battle mon structure after level up
  5803.                 if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && gBattleMons[0].hp)
  5804.                 {
  5805.                     gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL);
  5806.                     gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP);
  5807.                     gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
  5808.                     gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
  5809.                     gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
  5810.                     // Why is this duplicated?
  5811.                     gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  5812.                     gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  5813.                     gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
  5814.                     gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF);
  5815.                 }
  5816.                 // What is else if?
  5817.                 if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
  5818.                 {
  5819.                     gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL);
  5820.                     gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP);
  5821.                     gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
  5822.                     gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
  5823.                     gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
  5824.                     // Duplicated again, but this time there's no Sp Defense
  5825.                     gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  5826.                     gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  5827.                     gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
  5828.                 }
  5829.             }
  5830.             else
  5831.             {
  5832.                 gBattleMoveDamage = 0;
  5833.             }
  5834.             gBattleStruct->getexpStateTracker = 5;
  5835.         }
  5836.         break;
  5837.     case 5: // looper increment
  5838.         if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp
  5839.             gBattleStruct->getexpStateTracker = 3;
  5840.         else
  5841.         {
  5842.             gBattleStruct->expGetterID++;
  5843.             if (gBattleStruct->expGetterID <= 5)
  5844.                 gBattleStruct->getexpStateTracker = 2; // loop again
  5845.             else
  5846.                 gBattleStruct->getexpStateTracker = 6; // we're done
  5847.         }
  5848.         break;
  5849.     case 6: // increment instruction
  5850.         if (gBattleExecBuffer == 0)
  5851.         {
  5852.             // not sure why gf clears the item and ability here
  5853.             gBattleMons[gBank1].item = 0;
  5854.             gBattleMons[gBank1].ability = 0;
  5855.             gBattlescriptCurrInstr += 2;
  5856.         }
  5857.         break;
  5858.     }
  5859. }
  5860.  
  5861. #ifdef NONMATCHING
  5862. static void atk24(void)
  5863. {
  5864.     u16 HP_count = 0;
  5865.     int i;
  5866.     if (gBattleExecBuffer) {return;}
  5867.  
  5868.     for (i = 0; i < 6; i++)
  5869.     {
  5870.         if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
  5871.             HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP);
  5872.     }
  5873.  
  5874.     if (HP_count == 0)
  5875.         gBattleOutcome |= BATTLE_LOST;
  5876.  
  5877.     for (HP_count = 0, i = 0; i < 6; i++)
  5878.     {
  5879.         if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG))
  5880.             HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP);
  5881.     }
  5882.  
  5883.     if (!HP_count)
  5884.         gBattleOutcome |= BATTLE_WON;
  5885.  
  5886.     if (!gBattleOutcome && (gBattleTypeFlags & BATTLE_TYPE_LINK))
  5887.     {
  5888.         register int found1 asm("r2");
  5889.         register int found2 asm("r4");
  5890.  
  5891.         //I can't for the love of god decompile that part
  5892.  
  5893.         for (found1 = 0, i = 0; i < gBattlersCount; i += 2)
  5894.         {
  5895.             if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40)
  5896.                 found1++;
  5897.         }
  5898.  
  5899.         for (found2 = 0, i = 1; i < gBattlersCount; i += 2)
  5900.         {
  5901.             if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40)
  5902.                 found2++;
  5903.         }
  5904.  
  5905.         if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
  5906.         {
  5907.             if (found2 + found1 > 1)
  5908.                 gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  5909.             else
  5910.                 gBattlescriptCurrInstr += 5;
  5911.         }
  5912.         else
  5913.         {
  5914.             if (found2 != 0 && found1 != 0)
  5915.                 gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  5916.             else
  5917.                 gBattlescriptCurrInstr += 5;
  5918.         }
  5919.     }
  5920.     else
  5921.         gBattlescriptCurrInstr += 5;
  5922.  
  5923. }
  5924. #else
  5925. NAKED
  5926. static void atk24(void)
  5927. {
  5928.     asm(".syntax unified\n\
  5929.    push {r4-r7,lr}\n\
  5930.    mov r7, r8\n\
  5931.    push {r7}\n\
  5932.    movs r6, 0\n\
  5933.    ldr r0, _08020AF0 @ =gBattleExecBuffer\n\
  5934.    ldr r0, [r0]\n\
  5935.    cmp r0, 0\n\
  5936.    beq _080209C6\n\
  5937.    b _08020B46\n\
  5938. _080209C6:\n\
  5939.    movs r5, 0\n\
  5940. _080209C8:\n\
  5941.    movs r0, 0x64\n\
  5942.    adds r1, r5, 0\n\
  5943.    muls r1, r0\n\
  5944.    ldr r0, _08020AF4 @ =gPlayerParty\n\
  5945.    adds r4, r1, r0\n\
  5946.    adds r0, r4, 0\n\
  5947.    movs r1, 0xB\n\
  5948.    bl GetMonData\n\
  5949.    cmp r0, 0\n\
  5950.    beq _080209F8\n\
  5951.    adds r0, r4, 0\n\
  5952.    movs r1, 0x2D\n\
  5953.    bl GetMonData\n\
  5954.    cmp r0, 0\n\
  5955.    bne _080209F8\n\
  5956.    adds r0, r4, 0\n\
  5957.    movs r1, 0x39\n\
  5958.    bl GetMonData\n\
  5959.    adds r0, r6, r0\n\
  5960.    lsls r0, 16\n\
  5961.    lsrs r6, r0, 16\n\
  5962. _080209F8:\n\
  5963.    adds r5, 0x1\n\
  5964.    cmp r5, 0x5\n\
  5965.    ble _080209C8\n\
  5966.    cmp r6, 0\n\
  5967.    bne _08020A0C\n\
  5968.    ldr r0, _08020AF8 @ =gBattleOutcome\n\
  5969.    ldrb r1, [r0]\n\
  5970.    movs r2, 0x2\n\
  5971.    orrs r1, r2\n\
  5972.    strb r1, [r0]\n\
  5973. _08020A0C:\n\
  5974.    movs r6, 0\n\
  5975.    movs r5, 0\n\
  5976. _08020A10:\n\
  5977.    movs r0, 0x64\n\
  5978.    adds r1, r5, 0\n\
  5979.    muls r1, r0\n\
  5980.    ldr r0, _08020AFC @ =gEnemyParty\n\
  5981.    adds r4, r1, r0\n\
  5982.    adds r0, r4, 0\n\
  5983.    movs r1, 0xB\n\
  5984.    bl GetMonData\n\
  5985.    cmp r0, 0\n\
  5986.    beq _08020A40\n\
  5987.    adds r0, r4, 0\n\
  5988.    movs r1, 0x2D\n\
  5989.    bl GetMonData\n\
  5990.    cmp r0, 0\n\
  5991.    bne _08020A40\n\
  5992.    adds r0, r4, 0\n\
  5993.    movs r1, 0x39\n\
  5994.    bl GetMonData\n\
  5995.    adds r0, r6, r0\n\
  5996.    lsls r0, 16\n\
  5997.    lsrs r6, r0, 16\n\
  5998. _08020A40:\n\
  5999.    adds r5, 0x1\n\
  6000.    cmp r5, 0x5\n\
  6001.    ble _08020A10\n\
  6002.    ldr r2, _08020AF8 @ =gBattleOutcome\n\
  6003.    cmp r6, 0\n\
  6004.    bne _08020A54\n\
  6005.    ldrb r0, [r2]\n\
  6006.    movs r1, 0x1\n\
  6007.    orrs r0, r1\n\
  6008.    strb r0, [r2]\n\
  6009. _08020A54:\n\
  6010.    ldrb r0, [r2]\n\
  6011.    cmp r0, 0\n\
  6012.    bne _08020B3E\n\
  6013.    ldr r2, _08020B00 @ =gBattleTypeFlags\n\
  6014.    ldrh r1, [r2]\n\
  6015.    movs r0, 0x2\n\
  6016.    ands r0, r1\n\
  6017.    mov r8, r2\n\
  6018.    cmp r0, 0\n\
  6019.    beq _08020B3E\n\
  6020.    movs r2, 0\n\
  6021.    movs r5, 0\n\
  6022.    ldr r0, _08020B04 @ =gBattlersCount\n\
  6023.    ldrb r3, [r0]\n\
  6024.    mov r12, r0\n\
  6025.    ldr r7, _08020B08 @ =gBattlescriptCurrInstr\n\
  6026.    cmp r2, r3\n\
  6027.    bge _08020AA0\n\
  6028.    ldr r0, _08020B0C @ =gHitMarker\n\
  6029.    movs r1, 0x80\n\
  6030.    lsls r1, 21\n\
  6031.    ldr r6, [r0]\n\
  6032.    adds r4, r3, 0\n\
  6033.    ldr r3, _08020B10 @ =gSpecialStatuses\n\
  6034. _08020A84:\n\
  6035.    adds r0, r1, 0\n\
  6036.    lsls r0, r5\n\
  6037.    ands r0, r6\n\
  6038.    cmp r0, 0\n\
  6039.    beq _08020A98\n\
  6040.    ldrb r0, [r3]\n\
  6041.    lsls r0, 25\n\
  6042.    cmp r0, 0\n\
  6043.    blt _08020A98\n\
  6044.    adds r2, 0x1\n\
  6045. _08020A98:\n\
  6046.    adds r3, 0x28\n\
  6047.    adds r5, 0x2\n\
  6048.    cmp r5, r4\n\
  6049.    blt _08020A84\n\
  6050. _08020AA0:\n\
  6051.    movs r4, 0\n\
  6052.    movs r5, 0x1\n\
  6053.    mov r0, r12\n\
  6054.    ldrb r3, [r0]\n\
  6055.    cmp r5, r3\n\
  6056.    bge _08020ADA\n\
  6057.    ldr r0, _08020B0C @ =gHitMarker\n\
  6058.    movs r1, 0x80\n\
  6059.    lsls r1, 21\n\
  6060.    mov r12, r1\n\
  6061.    ldr r1, [r0]\n\
  6062.    ldr r0, _08020B10 @ =gSpecialStatuses\n\
  6063.    adds r6, r3, 0\n\
  6064.    adds r3, r0, 0\n\
  6065.    adds r3, 0x14\n\
  6066. _08020ABE:\n\
  6067.    mov r0, r12\n\
  6068.    lsls r0, r5\n\
  6069.    ands r0, r1\n\
  6070.    cmp r0, 0\n\
  6071.    beq _08020AD2\n\
  6072.    ldrb r0, [r3]\n\
  6073.    lsls r0, 25\n\
  6074.    cmp r0, 0\n\
  6075.    blt _08020AD2\n\
  6076.    adds r4, 0x1\n\
  6077. _08020AD2:\n\
  6078.    adds r3, 0x28\n\
  6079.    adds r5, 0x2\n\
  6080.    cmp r5, r6\n\
  6081.    blt _08020ABE\n\
  6082. _08020ADA:\n\
  6083.    mov r0, r8\n\
  6084.    ldrh r1, [r0]\n\
  6085.    movs r0, 0x40\n\
  6086.    ands r0, r1\n\
  6087.    cmp r0, 0\n\
  6088.    beq _08020B14\n\
  6089.    adds r0, r4, r2\n\
  6090.    cmp r0, 0x1\n\
  6091.    bgt _08020B1C\n\
  6092.    b _08020B36\n\
  6093.    .align 2, 0\n\
  6094. _08020AF0: .4byte gBattleExecBuffer\n\
  6095. _08020AF4: .4byte gPlayerParty\n\
  6096. _08020AF8: .4byte gBattleOutcome\n\
  6097. _08020AFC: .4byte gEnemyParty\n\
  6098. _08020B00: .4byte gBattleTypeFlags\n\
  6099. _08020B04: .4byte gBattlersCount\n\
  6100. _08020B08: .4byte gBattlescriptCurrInstr\n\
  6101. _08020B0C: .4byte gHitMarker\n\
  6102. _08020B10: .4byte gSpecialStatuses\n\
  6103. _08020B14:\n\
  6104.    cmp r4, 0\n\
  6105.    beq _08020B36\n\
  6106.    cmp r2, 0\n\
  6107.    beq _08020B36\n\
  6108. _08020B1C:\n\
  6109.    ldr r2, [r7]\n\
  6110.    ldrb r1, [r2, 0x1]\n\
  6111.    ldrb r0, [r2, 0x2]\n\
  6112.    lsls r0, 8\n\
  6113.    adds r1, r0\n\
  6114.    ldrb r0, [r2, 0x3]\n\
  6115.    lsls r0, 16\n\
  6116.    adds r1, r0\n\
  6117.    ldrb r0, [r2, 0x4]\n\
  6118.    lsls r0, 24\n\
  6119.    adds r1, r0\n\
  6120.    str r1, [r7]\n\
  6121.    b _08020B46\n\
  6122. _08020B36:\n\
  6123.    ldr r0, [r7]\n\
  6124.    adds r0, 0x5\n\
  6125.    str r0, [r7]\n\
  6126.    b _08020B46\n\
  6127. _08020B3E:\n\
  6128.    ldr r1, _08020B50 @ =gBattlescriptCurrInstr\n\
  6129.    ldr r0, [r1]\n\
  6130.    adds r0, 0x5\n\
  6131.    str r0, [r1]\n\
  6132. _08020B46:\n\
  6133.    pop {r3}\n\
  6134.    mov r8, r3\n\
  6135.    pop {r4-r7}\n\
  6136.    pop {r0}\n\
  6137.    bx r0\n\
  6138.    .align 2, 0\n\
  6139. _08020B50: .4byte gBattlescriptCurrInstr\n\
  6140.        .syntax divided\n");
  6141. }
  6142. #endif
  6143.  
  6144. static void MoveValuesCleanUp(void)
  6145. {
  6146.     gMoveResultFlags = 0;
  6147.     gBattleStruct->dmgMultiplier = 1;
  6148.     gCritMultiplier = 1;
  6149.     gBattleCommunication[MOVE_EFFECT_BYTE] = 0;
  6150.     gBattleCommunication[6] = 0;
  6151.     gHitMarker &= ~(HITMARKER_DESTINYBOND);
  6152.     gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
  6153. }
  6154.  
  6155. static void atk25_movevaluescleanup(void)
  6156. {
  6157.     MoveValuesCleanUp();
  6158.     gBattlescriptCurrInstr += 1;
  6159. }
  6160.  
  6161. static void atk26_setmultihit(void)
  6162. {
  6163.     gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1);
  6164.     gBattlescriptCurrInstr += 2;
  6165. }
  6166.  
  6167. static void atk27_decrementmultihit(void)
  6168. {
  6169.     if (--gMultiHitCounter == 0)
  6170.         gBattlescriptCurrInstr += 5;
  6171.     else
  6172.         gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6173. }
  6174.  
  6175. static void atk28_goto(void)
  6176. {
  6177.     gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6178. }
  6179.  
  6180. static void atk29_jumpifbyte(void)
  6181. {
  6182.     u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1);
  6183.     u8* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2);
  6184.     u8 value = T2_READ_8(gBattlescriptCurrInstr + 6);
  6185.     u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 7);
  6186.     gBattlescriptCurrInstr += 11;
  6187.     switch (caseID)
  6188.     {
  6189.     case CMP_EQUAL:
  6190.         if (*ptr == value)
  6191.             gBattlescriptCurrInstr = jump_loc;
  6192.         break;
  6193.     case CMP_NOT_EQUAL:
  6194.         if (*ptr != value)
  6195.             gBattlescriptCurrInstr = jump_loc;
  6196.         break;
  6197.     case CMP_GREATER_THAN:
  6198.         if (*ptr > value)
  6199.             gBattlescriptCurrInstr = jump_loc;
  6200.         break;
  6201.     case CMP_LESS_THAN:
  6202.         if (*ptr < value)
  6203.             gBattlescriptCurrInstr = jump_loc;
  6204.         break;
  6205.     case CMP_COMMON_BITS:
  6206.         if (*ptr & value)
  6207.             gBattlescriptCurrInstr = jump_loc;
  6208.         break;
  6209.     case CMP_NO_COMMON_BITS:
  6210.         if (!(*ptr & value))
  6211.             gBattlescriptCurrInstr = jump_loc;
  6212.         break;
  6213.     }
  6214. }
  6215.  
  6216. static void atk2A_jumpifhalfword(void)
  6217. {
  6218.     u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1);
  6219.     u16* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2);
  6220.     u16 value = T2_READ_16(gBattlescriptCurrInstr + 6);
  6221.     u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 8);
  6222.     gBattlescriptCurrInstr += 12;
  6223.     switch (caseID)
  6224.     {
  6225.     case CMP_EQUAL:
  6226.         if (*ptr == value)
  6227.             gBattlescriptCurrInstr = jump_loc;
  6228.         break;
  6229.     case CMP_NOT_EQUAL:
  6230.         if (*ptr != value)
  6231.             gBattlescriptCurrInstr = jump_loc;
  6232.         break;
  6233.     case CMP_GREATER_THAN:
  6234.         if (*ptr > value)
  6235.             gBattlescriptCurrInstr = jump_loc;
  6236.         break;
  6237.     case CMP_LESS_THAN:
  6238.         if (*ptr < value)
  6239.             gBattlescriptCurrInstr = jump_loc;
  6240.         break;
  6241.     case CMP_COMMON_BITS:
  6242.         if (*ptr & value)
  6243.             gBattlescriptCurrInstr = jump_loc;
  6244.         break;
  6245.     case CMP_NO_COMMON_BITS:
  6246.         if (!(*ptr & value))
  6247.             gBattlescriptCurrInstr = jump_loc;
  6248.         break;
  6249.     }
  6250. }
  6251.  
  6252. // Strange that there's an instance of T1_READ_32 in what seems to be a T2 function. see global.h for the distinction.
  6253. static void atk2B_jumpifword(void)
  6254. {
  6255.     u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1);
  6256.     u32* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2);
  6257.     u32 value = T1_READ_32(gBattlescriptCurrInstr + 6);
  6258.     u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10);
  6259.     gBattlescriptCurrInstr += 14;
  6260.     switch (caseID)
  6261.     {
  6262.     case CMP_EQUAL:
  6263.         if (*ptr == value)
  6264.             gBattlescriptCurrInstr = jump_loc;
  6265.         break;
  6266.     case CMP_NOT_EQUAL:
  6267.         if (*ptr != value)
  6268.             gBattlescriptCurrInstr = jump_loc;
  6269.         break;
  6270.     case CMP_GREATER_THAN:
  6271.         if (*ptr > value)
  6272.             gBattlescriptCurrInstr = jump_loc;
  6273.         break;
  6274.     case CMP_LESS_THAN:
  6275.         if (*ptr < value)
  6276.             gBattlescriptCurrInstr = jump_loc;
  6277.         break;
  6278.     case CMP_COMMON_BITS:
  6279.         if (*ptr & value)
  6280.             gBattlescriptCurrInstr = jump_loc;
  6281.         break;
  6282.     case CMP_NO_COMMON_BITS:
  6283.         if (!(*ptr & value))
  6284.             gBattlescriptCurrInstr = jump_loc;
  6285.         break;
  6286.     }
  6287. }
  6288.  
  6289. static void atk2C_jumpifarrayequal(void)
  6290. {
  6291.     //Mem1, Mem2, Size, Jump Loc
  6292.     u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6293.     u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5);
  6294.     u32 size = T2_READ_8(gBattlescriptCurrInstr + 9);
  6295.     u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10);
  6296.  
  6297.     u8 i;
  6298.     for (i = 0; i < size; i++)
  6299.     {
  6300.         if (*mem1 != *mem2)
  6301.         {
  6302.             gBattlescriptCurrInstr += 14;
  6303.             break;
  6304.         }
  6305.         mem1++, mem2++;
  6306.     }
  6307.  
  6308.     if (i == size)
  6309.         gBattlescriptCurrInstr = jump_loc;
  6310. }
  6311.  
  6312. static void atk2D_jumpifarraynotequal(void)
  6313. {
  6314.     //Mem1, Mem2, Size, Jump Loc
  6315.     u8 equal_bytes = 0;
  6316.     u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6317.     u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5);
  6318.     u32 size = T2_READ_8(gBattlescriptCurrInstr + 9);
  6319.     u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10);
  6320.  
  6321.     u8 i;
  6322.     for (i = 0; i < size; i++)
  6323.     {
  6324.         if (*mem1 == *mem2)
  6325.         {
  6326.             equal_bytes++;
  6327.         }
  6328.         mem1++, mem2++;
  6329.     }
  6330.  
  6331.     if (equal_bytes != size)
  6332.         gBattlescriptCurrInstr = jump_loc;
  6333.     else
  6334.         gBattlescriptCurrInstr += 14;
  6335. }
  6336.  
  6337. static void atk2E_setbyte(void)
  6338. {
  6339.     u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6340.     *mem = T2_READ_8(gBattlescriptCurrInstr + 5);
  6341.     gBattlescriptCurrInstr += 6;
  6342. }
  6343.  
  6344. static void atk2F_addbyte(void)
  6345. {
  6346.     u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6347.     *mem += T2_READ_8(gBattlescriptCurrInstr + 5);
  6348.     gBattlescriptCurrInstr += 6;
  6349. }
  6350.  
  6351. static void atk30_subbyte(void)
  6352. {
  6353.     u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6354.     *mem -= T2_READ_8(gBattlescriptCurrInstr + 5);
  6355.     gBattlescriptCurrInstr += 6;
  6356. }
  6357.  
  6358. static void atk31_copyarray(void)
  6359. {
  6360.     u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6361.     u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5);
  6362.     s32 size = T2_READ_8(gBattlescriptCurrInstr + 9);
  6363.  
  6364.     s32 i;
  6365.     for (i = 0; i < size; i++)
  6366.     {
  6367.         mem1[i] = mem2[i];
  6368.     }
  6369.  
  6370.     gBattlescriptCurrInstr += 10;
  6371. }
  6372.  
  6373. static void atk32_copyarraywithindex(void)
  6374. {
  6375.     u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6376.     u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5);
  6377.     u8* index = T2_READ_PTR(gBattlescriptCurrInstr + 9);
  6378.     s32 size = T2_READ_8(gBattlescriptCurrInstr + 13);
  6379.  
  6380.     s32 i;
  6381.     for (i = 0; i < size; i++)
  6382.     {
  6383.         mem1[i] = mem2[i + *index];
  6384.     }
  6385.  
  6386.     gBattlescriptCurrInstr += 14;
  6387. }
  6388.  
  6389. static void atk33_orbyte(void)
  6390. {
  6391.     u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6392.     *mem |= T2_READ_8(gBattlescriptCurrInstr + 5);
  6393.     gBattlescriptCurrInstr += 6;
  6394. }
  6395.  
  6396. static void atk34_orhalfword(void)
  6397. {
  6398.     u16* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6399.     u16 val = T2_READ_16(gBattlescriptCurrInstr + 5);
  6400.  
  6401.     *mem |= val;
  6402.     gBattlescriptCurrInstr += 7;
  6403. }
  6404.  
  6405. static void atk35_orword(void)
  6406. {
  6407.     u32* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6408.     u32 val = T2_READ_32(gBattlescriptCurrInstr + 5);
  6409.  
  6410.     *mem |= val;
  6411.     gBattlescriptCurrInstr += 9;
  6412. }
  6413.  
  6414. static void atk36_bicbyte(void)
  6415. {
  6416.     u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6417.     *mem &= ~(T2_READ_8(gBattlescriptCurrInstr + 5));
  6418.     gBattlescriptCurrInstr += 6;
  6419. }
  6420.  
  6421. static void atk37_bichalfword(void)
  6422. {
  6423.     u16* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6424.     u16 val = T2_READ_16(gBattlescriptCurrInstr + 5);
  6425.  
  6426.     *mem &= ~val;
  6427.     gBattlescriptCurrInstr += 7;
  6428. }
  6429.  
  6430. static void atk38_bicword(void)
  6431. {
  6432.     u32* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1);
  6433.     u32 val = T2_READ_32(gBattlescriptCurrInstr + 5);
  6434.  
  6435.     *mem &= ~val;
  6436.     gBattlescriptCurrInstr += 9;
  6437. }
  6438.  
  6439. static void atk39_pause(void)
  6440. {
  6441.     if (gBattleExecBuffer == 0)
  6442.     {
  6443.         u16 value = T2_READ_16(gBattlescriptCurrInstr + 1);
  6444.         if (++gPauseCounterBattle >= value)
  6445.         {
  6446.             gPauseCounterBattle = 0;
  6447.             gBattlescriptCurrInstr += 3;
  6448.         }
  6449.     }
  6450. }
  6451.  
  6452. static void atk3A_waitstate(void)
  6453. {
  6454.     if (gBattleExecBuffer == 0)
  6455.         gBattlescriptCurrInstr++;
  6456. }
  6457.  
  6458. static void atk3B_healthbar_update(void)
  6459. {
  6460.     if (!T2_READ_8(gBattlescriptCurrInstr + 1))
  6461.         gActiveBattler = gBankTarget;
  6462.     else
  6463.         gActiveBattler = gBankAttacker;
  6464.  
  6465.     EmitHealthBarUpdate(0, gBattleMoveDamage);
  6466.     MarkBufferBankForExecution(gActiveBattler);
  6467.     gBattlescriptCurrInstr += 2;
  6468. }
  6469.  
  6470. static void atk3C_return(void)
  6471. {
  6472.     BattleScriptPop();
  6473. }
  6474.  
  6475. static void atk3D_end(void)
  6476. {
  6477.     gMoveResultFlags = 0;
  6478.     gActiveBattler = 0;
  6479.     gCurrentActionFuncId = 0xB;
  6480. }
  6481.  
  6482. static void atk3E_end2(void)
  6483. {
  6484.     //not much difference between this and 3D. It's more apparent in Emerald
  6485.     gActiveBattler = 0;
  6486.     gCurrentActionFuncId = 0xB;
  6487. }
  6488.  
  6489. static void atk3F_end3(void) //pops the main function stack
  6490. {
  6491.     BattleScriptPop();
  6492.     if (B_FUNCTION_STACK->size)
  6493.         B_FUNCTION_STACK->size--;
  6494.     gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size];
  6495. }
  6496.  
  6497. static void atk41_call(void)
  6498. {
  6499.     BattleScriptPush(gBattlescriptCurrInstr + 5);
  6500.     gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  6501. }
  6502.  
  6503. static void atk42_jumpiftype2(void) //u8 bank, u8 type, *ptr
  6504. {
  6505.     u8 bank = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1));
  6506.  
  6507.     if (T1_READ_8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type1 || T1_READ_8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type2)
  6508.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
  6509.     else
  6510.         gBattlescriptCurrInstr += 7;
  6511. }
  6512.  
  6513. static void atk43_jumpifabilitypresent(void)
  6514. {
  6515.     if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, T2_READ_8(gBattlescriptCurrInstr + 1), 0, 0))
  6516.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  6517.     else
  6518.         gBattlescriptCurrInstr += 6;
  6519. }
  6520.  
  6521. static void atk44_endselectionscript(void)
  6522. {
  6523.     ewram16060(gBankAttacker) = 1;
  6524. }
  6525.  
  6526. static void atk45_playanimation(void)
  6527. {
  6528.     const u16* argumentPtr;
  6529.  
  6530.     gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]);
  6531.     argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3);
  6532.  
  6533.     if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE
  6534.         || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE
  6535.         || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE)
  6536.     {
  6537.         EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
  6538.         MarkBufferBankForExecution(gActiveBattler);
  6539.         gBattlescriptCurrInstr += 7;
  6540.     }
  6541.     else if (gHitMarker & HITMARKER_NO_ANIMATIONS)
  6542.     {
  6543.         BattleScriptPush(gBattlescriptCurrInstr + 7);
  6544.         gBattlescriptCurrInstr = BattleScript_Pausex20;
  6545.     }
  6546.     else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES
  6547.              || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES
  6548.              || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES
  6549.              || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES)
  6550.     {
  6551.         EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
  6552.         MarkBufferBankForExecution(gActiveBattler);
  6553.         gBattlescriptCurrInstr += 7;
  6554.     }
  6555.     else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)
  6556.     {
  6557.         gBattlescriptCurrInstr += 7;
  6558.     }
  6559.     else
  6560.     {
  6561.         EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
  6562.         MarkBufferBankForExecution(gActiveBattler);
  6563.         gBattlescriptCurrInstr += 7;
  6564.     }
  6565. }
  6566.  
  6567. static void atk46_playanimation2(void) // animation Id is stored in the first pointer
  6568. {
  6569.     const u16* argumentPtr;
  6570.     const u8* animationIdPtr;
  6571.  
  6572.     gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]);
  6573.     animationIdPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2);
  6574.     argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6);
  6575.  
  6576.     if (*animationIdPtr == B_ANIM_STATS_CHANGE
  6577.         || *animationIdPtr == B_ANIM_SNATCH_MOVE
  6578.         || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE)
  6579.     {
  6580.         EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
  6581.         MarkBufferBankForExecution(gActiveBattler);
  6582.         gBattlescriptCurrInstr += 10;
  6583.     }
  6584.     else if (gHitMarker & HITMARKER_NO_ANIMATIONS)
  6585.     {
  6586.         gBattlescriptCurrInstr += 10;
  6587.     }
  6588.     else if (*animationIdPtr == B_ANIM_RAIN_CONTINUES
  6589.              || *animationIdPtr == B_ANIM_SUN_CONTINUES
  6590.              || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES
  6591.              || *animationIdPtr == B_ANIM_HAIL_CONTINUES)
  6592.     {
  6593.         EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
  6594.         MarkBufferBankForExecution(gActiveBattler);
  6595.         gBattlescriptCurrInstr += 10;
  6596.     }
  6597.     else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)
  6598.     {
  6599.         gBattlescriptCurrInstr += 10;
  6600.     }
  6601.     else
  6602.     {
  6603.         EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
  6604.         MarkBufferBankForExecution(gActiveBattler);
  6605.         gBattlescriptCurrInstr += 10;
  6606.     }
  6607. }
  6608.  
  6609. static void atk47_setgraphicalstatchangevalues(void)
  6610. {
  6611.     u8 to_add = 0;
  6612.     switch (gBattleStruct->statChanger & 0xF0)
  6613.     {
  6614.     case 0x10: //+1
  6615.         to_add = 0xF;
  6616.         break;
  6617.     case 0x20: //+2
  6618.         to_add = 0x27;
  6619.         break;
  6620.     case 0x90: //-1
  6621.         to_add = 0x16;
  6622.         break;
  6623.     case 0xA0: //-2
  6624.         to_add = 0x2E;
  6625.         break;
  6626.     }
  6627.     gBattleStruct->animArg1 = (gBattleStruct->statChanger & 0xF) + to_add - 1;
  6628.     gBattleStruct->animArg2 = 0;
  6629.     gBattlescriptCurrInstr++;
  6630. }
  6631.  
  6632. #ifdef NONMATCHING
  6633. static void atk48_playstatchangeanimation(void)
  6634. {
  6635.     int curr_stat = 0;
  6636.     u16 stat_animID = 0;
  6637.     int changeable_stats = 0;
  6638.     u32 stats_to_check;
  6639.     u8 arg3;
  6640.  
  6641.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  6642.     stats_to_check = T2_READ_8(gBattlescriptCurrInstr + 2);
  6643.     arg3 = T2_READ_8(gBattlescriptCurrInstr + 3);
  6644.     if (arg3 & 1)
  6645.     {
  6646.         u16 r1 = 0x15;
  6647.         if (arg3 & 0x2)
  6648.             r1 = 0x2D;
  6649.         while (stats_to_check != 0)
  6650.         {
  6651.             if (!(stats_to_check & 1))
  6652.                 continue;
  6653.             if (!(T2_READ_8(gBattlescriptCurrInstr + 3)))
  6654.             {
  6655.                 u8 ability;
  6656.                 if (gSideTimers[GetBattlerPosition(gActiveBattler) & 1].mistTimer)
  6657.                     continue;
  6658.                 ability = gBattleMons[gActiveBattler].ability;
  6659.                 if (ability == ABILITY_CLEAR_BODY || ability == ABILITY_WHITE_SMOKE || (ability == ABILITY_KEEN_EYE && curr_stat == 6) || (ability == ABILITY_HYPER_CUTTER && curr_stat == 1))
  6660.                     continue;
  6661.             }
  6662.             if (gBattleMons[gActiveBattler].statStages[curr_stat] > 0)
  6663.             {
  6664.                 stat_animID = r1;
  6665.                 changeable_stats++;
  6666.             }
  6667.  
  6668.             stats_to_check >>= 1;
  6669.             r1 += 1;
  6670.             curr_stat++;
  6671.         }
  6672.         if (changeable_stats > 1 && T2_READ_8(gBattlescriptCurrInstr + 3) & 2)
  6673.             stat_animID = 0x39;
  6674.         else
  6675.             stat_animID = 0x3A;
  6676.     }
  6677.     else
  6678.     {
  6679.         u16 r1 = 0x15;
  6680.         if (arg3 & 0x2)
  6681.             r1 = 0x2D;
  6682.         while (stats_to_check != 0)
  6683.         {
  6684.             if (!(stats_to_check & 1))
  6685.                 continue;
  6686.             if (gBattleMons[gActiveBattler].statStages[curr_stat] < 0xB)
  6687.             {
  6688.                 stat_animID = r1;
  6689.                 changeable_stats++;
  6690.             }
  6691.  
  6692.             stats_to_check >>= 1;
  6693.             r1 += 1;
  6694.             curr_stat++;
  6695.         }
  6696.         if (changeable_stats > 1 && T2_READ_8(gBattlescriptCurrInstr + 3) & 2)
  6697.             stat_animID = 0x37;
  6698.         else
  6699.             stat_animID = 0x38;
  6700.     }
  6701.     if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1)
  6702.         || changeable_stats == 0 || gBattleStruct->filler2[0] != 0)
  6703.         gBattlescriptCurrInstr += 4;
  6704.     else
  6705.     {
  6706.         EmitBattleAnimation(0, 1, stat_animID);
  6707.         MarkBufferBankForExecution(gActiveBattler);
  6708.         if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1)
  6709.             gBattleStruct->filler2[0] = 1;
  6710.         gBattlescriptCurrInstr += 4;
  6711.     }
  6712. }
  6713.  
  6714. #else
  6715. NAKED
  6716. static void atk48_playstatchangeanimation(void)
  6717. {
  6718.     asm(".syntax unified\n\
  6719. push {r4-r7,lr}\n\
  6720.    mov r7, r10\n\
  6721.    mov r6, r9\n\
  6722.    mov r5, r8\n\
  6723.    push {r5-r7}\n\
  6724.    sub sp, 0x4\n\
  6725.    movs r7, 0\n\
  6726.    movs r0, 0\n\
  6727.    mov r8, r0\n\
  6728.    movs r3, 0\n\
  6729.    ldr r5, _08021670 @ =gBattlescriptCurrInstr\n\
  6730.    ldr r0, [r5]\n\
  6731.    ldrb r0, [r0, 0x1]\n\
  6732.    str r3, [sp]\n\
  6733.    bl GetBattleBank\n\
  6734.    ldr r2, _08021674 @ =gActiveBattler\n\
  6735.    strb r0, [r2]\n\
  6736.    ldr r0, [r5]\n\
  6737.    ldrb r4, [r0, 0x2]\n\
  6738.    ldrb r1, [r0, 0x3]\n\
  6739.    movs r0, 0x1\n\
  6740.    ands r0, r1\n\
  6741.    ldr r3, [sp]\n\
  6742.    cmp r0, 0\n\
  6743.    beq _08021710\n\
  6744.    movs r0, 0x2\n\
  6745.    ands r0, r1\n\
  6746.    movs r1, 0x15\n\
  6747.    cmp r0, 0\n\
  6748.    beq _0802163C\n\
  6749.    movs r1, 0x2D\n\
  6750. _0802163C:\n\
  6751.    cmp r4, 0\n\
  6752.    beq _080216E4\n\
  6753.    movs r0, 0x1\n\
  6754.    mov r10, r0\n\
  6755.    ldr r0, _08021678 @ =gBattleMons+0x18 @ gBattleMons.statStages\n\
  6756.    mov r9, r0\n\
  6757.    lsls r5, r1, 16\n\
  6758. _0802164A:\n\
  6759.    adds r0, r4, 0\n\
  6760.    mov r1, r10\n\
  6761.    ands r0, r1\n\
  6762.    cmp r0, 0\n\
  6763.    beq _080216D6\n\
  6764.    ldr r0, _08021670 @ =gBattlescriptCurrInstr\n\
  6765.    ldr r0, [r0]\n\
  6766.    ldrb r1, [r0, 0x3]\n\
  6767.    movs r0, 0x8\n\
  6768.    ands r0, r1\n\
  6769.    cmp r0, 0\n\
  6770.    beq _0802167C\n\
  6771.    ldr r0, _08021674 @ =gActiveBattler\n\
  6772.    ldrb r1, [r0]\n\
  6773.    movs r0, 0x58\n\
  6774.    muls r0, r1\n\
  6775.    adds r0, r7, r0\n\
  6776.    b _080216C4\n\
  6777.    .align 2, 0\n\
  6778. _08021670: .4byte gBattlescriptCurrInstr\n\
  6779. _08021674: .4byte gActiveBattler\n\
  6780. _08021678: .4byte gBattleMons+0x18 @ gBattleMons.statStages\n\
  6781. _0802167C:\n\
  6782.    ldr r6, _08021700 @ =gActiveBattler\n\
  6783.    ldrb r0, [r6]\n\
  6784.    str r3, [sp]\n\
  6785.    bl GetBattlerPosition\n\
  6786.    mov r1, r10\n\
  6787.    ands r1, r0\n\
  6788.    lsls r0, r1, 1\n\
  6789.    adds r0, r1\n\
  6790.    lsls r0, 2\n\
  6791.    ldr r1, _08021704 @ =gSideTimers\n\
  6792.    adds r0, r1\n\
  6793.    ldrb r0, [r0, 0x2]\n\
  6794.    ldr r3, [sp]\n\
  6795.    cmp r0, 0\n\
  6796.    bne _080216D6\n\
  6797.    ldr r0, _08021708 @ =gBattleMons\n\
  6798.    ldrb r2, [r6]\n\
  6799.    movs r1, 0x58\n\
  6800.    muls r2, r1\n\
  6801.    adds r0, r2, r0\n\
  6802.    adds r0, 0x20\n\
  6803.    ldrb r0, [r0]\n\
  6804.    cmp r0, 0x1D\n\
  6805.    beq _080216D6\n\
  6806.    cmp r0, 0x49\n\
  6807.    beq _080216D6\n\
  6808.    cmp r0, 0x33\n\
  6809.    bne _080216BA\n\
  6810.    cmp r7, 0x6\n\
  6811.    beq _080216D6\n\
  6812. _080216BA:\n\
  6813.    cmp r0, 0x34\n\
  6814.    bne _080216C2\n\
  6815.    cmp r7, 0x1\n\
  6816.    beq _080216D6\n\
  6817. _080216C2:\n\
  6818.    adds r0, r7, r2\n\
  6819. _080216C4:\n\
  6820.    add r0, r9\n\
  6821.    ldrb r0, [r0]\n\
  6822.    lsls r0, 24\n\
  6823.    asrs r0, 24\n\
  6824.    cmp r0, 0\n\
  6825.    ble _080216D6\n\
  6826.    lsrs r0, r5, 16\n\
  6827.    mov r8, r0\n\
  6828.    adds r3, 0x1\n\
  6829. _080216D6:\n\
  6830.    lsrs r4, 1\n\
  6831.    movs r1, 0x80\n\
  6832.    lsls r1, 9\n\
  6833.    adds r5, r1\n\
  6834.    adds r7, 0x1\n\
  6835.    cmp r4, 0\n\
  6836.    bne _0802164A\n\
  6837. _080216E4:\n\
  6838.    ldr r0, _0802170C @ =gBattlescriptCurrInstr\n\
  6839.    mov r9, r0\n\
  6840.    cmp r3, 0x1\n\
  6841.    ble _08021772\n\
  6842.    ldr r0, [r0]\n\
  6843.    ldrb r1, [r0, 0x3]\n\
  6844.    movs r0, 0x2\n\
  6845.    ands r0, r1\n\
  6846.    movs r1, 0x39\n\
  6847.    mov r8, r1\n\
  6848.    cmp r0, 0\n\
  6849.    beq _08021772\n\
  6850.    movs r0, 0x3A\n\
  6851.    b _08021770\n\
  6852.    .align 2, 0\n\
  6853. _08021700: .4byte gActiveBattler\n\
  6854. _08021704: .4byte gSideTimers\n\
  6855. _08021708: .4byte gBattleMons\n\
  6856. _0802170C: .4byte gBattlescriptCurrInstr\n\
  6857. _08021710:\n\
  6858.    movs r0, 0x2\n\
  6859.    ands r0, r1\n\
  6860.    movs r1, 0xE\n\
  6861.    cmp r0, 0\n\
  6862.    beq _0802171C\n\
  6863.    movs r1, 0x26\n\
  6864. _0802171C:\n\
  6865.    mov r9, r5\n\
  6866.    cmp r4, 0\n\
  6867.    beq _08021758\n\
  6868.    ldr r6, _0802178C @ =gBattleMons+0x18 @ gBattleMons.statStages\n\
  6869.    adds r5, r2, 0\n\
  6870.    lsls r2, r1, 16\n\
  6871. _08021728:\n\
  6872.    movs r0, 0x1\n\
  6873.    ands r0, r4\n\
  6874.    cmp r0, 0\n\
  6875.    beq _0802174A\n\
  6876.    ldrb r1, [r5]\n\
  6877.    movs r0, 0x58\n\
  6878.    muls r0, r1\n\
  6879.    adds r0, r7, r0\n\
  6880.    adds r0, r6\n\
  6881.    ldrb r0, [r0]\n\
  6882.    lsls r0, 24\n\
  6883.    asrs r0, 24\n\
  6884.    cmp r0, 0xB\n\
  6885.    bgt _0802174A\n\
  6886.    lsrs r1, r2, 16\n\
  6887.    mov r8, r1\n\
  6888.    adds r3, 0x1\n\
  6889. _0802174A:\n\
  6890.    lsrs r4, 1\n\
  6891.    movs r0, 0x80\n\
  6892.    lsls r0, 9\n\
  6893.    adds r2, r0\n\
  6894.    adds r7, 0x1\n\
  6895.    cmp r4, 0\n\
  6896.    bne _08021728\n\
  6897. _08021758:\n\
  6898.    cmp r3, 0x1\n\
  6899.    ble _08021772\n\
  6900.    mov r1, r9\n\
  6901.    ldr r0, [r1]\n\
  6902.    ldrb r1, [r0, 0x3]\n\
  6903.    movs r0, 0x2\n\
  6904.    ands r0, r1\n\
  6905.    movs r1, 0x37\n\
  6906.    mov r8, r1\n\
  6907.    cmp r0, 0\n\
  6908.    beq _08021772\n\
  6909.    movs r0, 0x38\n\
  6910. _08021770:\n\
  6911.    mov r8, r0\n\
  6912. _08021772:\n\
  6913.    mov r1, r9\n\
  6914.    ldr r2, [r1]\n\
  6915.    ldrb r1, [r2, 0x3]\n\
  6916.    movs r0, 0x4\n\
  6917.    ands r0, r1\n\
  6918.    cmp r0, 0\n\
  6919.    beq _08021790\n\
  6920.    cmp r3, 0x1\n\
  6921.    bgt _08021790\n\
  6922.    adds r0, r2, 0x4\n\
  6923.    mov r1, r9\n\
  6924.    b _080217E6\n\
  6925.    .align 2, 0\n\
  6926. _0802178C: .4byte gBattleMons+0x18 @ gBattleMons.statStages\n\
  6927. _08021790:\n\
  6928.    cmp r3, 0\n\
  6929.    beq _080217E0\n\
  6930.    ldr r0, _080217D0 @ =gSharedMem\n\
  6931.    ldr r1, _080217D4 @ =0x000160dc\n\
  6932.    adds r4, r0, r1\n\
  6933.    ldrb r0, [r4]\n\
  6934.    cmp r0, 0\n\
  6935.    bne _080217E0\n\
  6936.    movs r0, 0\n\
  6937.    movs r1, 0x1\n\
  6938.    mov r2, r8\n\
  6939.    str r3, [sp]\n\
  6940.    bl EmitBattleAnimation\n\
  6941.    ldr r0, _080217D8 @ =gActiveBattler\n\
  6942.    ldrb r0, [r0]\n\
  6943.    bl MarkBufferBankForExecution\n\
  6944.    ldr r0, _080217DC @ =gBattlescriptCurrInstr\n\
  6945.    ldr r0, [r0]\n\
  6946.    ldrb r1, [r0, 0x3]\n\
  6947.    movs r0, 0x4\n\
  6948.    ands r0, r1\n\
  6949.    ldr r3, [sp]\n\
  6950.    cmp r0, 0\n\
  6951.    beq _080217CC\n\
  6952.    cmp r3, 0x1\n\
  6953.    ble _080217CC\n\
  6954.    movs r0, 0x1\n\
  6955.    strb r0, [r4]\n\
  6956. _080217CC:\n\
  6957.    ldr r1, _080217DC @ =gBattlescriptCurrInstr\n\
  6958.    b _080217E2\n\
  6959.    .align 2, 0\n\
  6960. _080217D0: .4byte gSharedMem\n\
  6961. _080217D4: .4byte 0x000160dc\n\
  6962. _080217D8: .4byte gActiveBattler\n\
  6963. _080217DC: .4byte gBattlescriptCurrInstr\n\
  6964. _080217E0:\n\
  6965.    mov r1, r9\n\
  6966. _080217E2:\n\
  6967.    ldr r0, [r1]\n\
  6968.    adds r0, 0x4\n\
  6969. _080217E6:\n\
  6970.    str r0, [r1]\n\
  6971.    add sp, 0x4\n\
  6972.    pop {r3-r5}\n\
  6973.    mov r8, r3\n\
  6974.    mov r9, r4\n\
  6975.    mov r10, r5\n\
  6976.    pop {r4-r7}\n\
  6977.    pop {r0}\n\
  6978.    bx r0\n\
  6979.        .syntax divided");
  6980. }
  6981.  
  6982. #endif // NONMATCHING
  6983.  
  6984. #ifdef NONMATCHING
  6985. static void atk49_moveend(void)
  6986. {
  6987.     int i;
  6988.     int effect = 0;
  6989.     u16 last_move = 0, *choiced_move_atk;
  6990.     int arg1, arg2, hold_effect_atk, move_type;
  6991.     if (gLastUsedMove != 0xFFFF)
  6992.         last_move = gLastUsedMove;
  6993.  
  6994.     arg1 = T2_READ_8(gBattlescriptCurrInstr + 1);
  6995.     arg2 = T2_READ_8(gBattlescriptCurrInstr + 2);
  6996.     if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
  6997.         hold_effect_atk = gEnigmaBerries[gBankAttacker].holdEffect;
  6998.     else
  6999.         hold_effect_atk = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
  7000.  
  7001.     choiced_move_atk = (u16*)(gBankAttacker * (ewram_addr + 0x160E8));
  7002.     if (gBattleStruct->dynamicMoveType)
  7003.         move_type = gBattleStruct->dynamicMoveType & 0x3F;
  7004.     else
  7005.         move_type = gBattleMoves[gCurrentMove].type;
  7006.  
  7007.     do
  7008.     {
  7009.         switch (gBattleStruct->cmd49StateTracker)
  7010.         {
  7011.         case 0: //rage check
  7012.             if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE
  7013.                 && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget
  7014.                 && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget)
  7015.                 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && TARGET_TURN_DAMAGED
  7016.                 && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB)
  7017.             {
  7018.                 gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++;
  7019.                 BattleScriptPushCursor();
  7020.                 gBattlescriptCurrInstr = BattleScript_RageIsBuilding;
  7021.                 effect = 1;
  7022.             }
  7023.             gBattleStruct->cmd49StateTracker++;
  7024.             break;
  7025.         case 1: //defrosting check
  7026.             if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE
  7027.                 && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget
  7028.                 && gSpecialStatuses[gBankTarget].moveturnLostHP
  7029.                 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && move_type == TYPE_FIRE)
  7030.             {
  7031.                 gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE);
  7032.                 gActiveBattler = gBankTarget;
  7033.                 EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1);
  7034.                 MarkBufferBankForExecution(gActiveBattler);
  7035.                 BattleScriptPushCursor();
  7036.                 gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove;
  7037.                 effect = 1;
  7038.             }
  7039.             gBattleStruct->cmd49StateTracker++;
  7040.             break;
  7041.         case 2: //target synchronize
  7042.             if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0))
  7043.                 effect = 1;
  7044.             gBattleStruct->cmd49StateTracker++;
  7045.             break;
  7046.         case 3: //contact abilities
  7047.             if (AbilityBattleEffects(ABILITYEFFECT_CONTACT, gBankTarget, 0, 0, 0))
  7048.                 effect = 1;
  7049.             gBattleStruct->cmd49StateTracker++;
  7050.             break;
  7051.         case 4: //status immunities
  7052.             if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0))
  7053.                 effect = 1; //it loops through 4 banks, so we increment after its done with all banks
  7054.             else
  7055.                 gBattleStruct->cmd49StateTracker++;
  7056.             break;
  7057.         case 5: //attacker synchronize
  7058.             if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0))
  7059.                 effect = 1;
  7060.             gBattleStruct->cmd49StateTracker++;
  7061.             break;
  7062.         case 6: //update choice band move
  7063.             if (gHitMarker & HITMARKER_OBEYS && hold_effect_atk == HOLD_EFFECT_CHOICE_BAND
  7064.                 && gLastUsedMove != MOVE_STRUGGLE && (*choiced_move_atk == 0 || *choiced_move_atk == 0xFFF)
  7065.                 && gLastUsedMove != MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
  7066.             {
  7067.                 *choiced_move_atk = gLastUsedMove;
  7068.                 for (i = 0; i < 4 && gBattleMons[gBankAttacker].moves[i] != *choiced_move_atk; i++){}
  7069.                 if (i == 4)
  7070.                     *choiced_move_atk = 0;
  7071.             }
  7072.             gBattleStruct->cmd49StateTracker++;
  7073.             break;
  7074.         case 7: //changed held items
  7075.             for (i = 0; i < gBattlersCount; i++)
  7076.             {
  7077.                 #define CHANGED_ITEM (((*u16)(gSharedMem + 0x160F0)))
  7078.                 if (CHANGED_ITEM(i))
  7079.                     gBattleMons[i].item = CHANGED_ITEM(i);
  7080.             }
  7081.             gBattleStruct->cmd49StateTracker++;
  7082.             break;
  7083.         case 8: //make sprite invisible
  7084.             if (gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)
  7085.                 && !(gHitMarker & HITMARKER_NO_ANIMATIONS))
  7086.             {
  7087.                 gActiveBattler = gBankAttacker;
  7088.                 EmitSpriteInvisibility(0, 1);
  7089.                 MarkBufferBankForExecution(gActiveBattler);
  7090.             }
  7091.             gBattleStruct->cmd49StateTracker++;
  7092.             break;
  7093.         case 9: //semi-invlurneable attacker make visible
  7094.             if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) || !(gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
  7095.                 || WasUnableToUseMove(gBankAttacker))
  7096.                 {
  7097.                     gActiveBattler = gBankAttacker;
  7098.                     EmitSpriteInvisibility(0, 0);
  7099.                     MarkBufferBankForExecution(gActiveBattler);
  7100.                     gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER);
  7101.                     gSpecialStatuses[gBankAttacker].restored_bank_sprite = 1;
  7102.                 }
  7103.             gBattleStruct->cmd49StateTracker++;
  7104.             break;
  7105.         case 10: //semi-invlurneable target make visible
  7106.             if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) || !(gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
  7107.                 || WasUnableToUseMove(gBankTarget))
  7108.                 {
  7109.                     gActiveBattler = gBankTarget;
  7110.                     EmitSpriteInvisibility(0, 0);
  7111.                     MarkBufferBankForExecution(gActiveBattler);
  7112.                     gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER);
  7113.                     gSpecialStatuses[gBankTarget].restored_bank_sprite = 1;
  7114.                 }
  7115.             gBattleStruct->cmd49StateTracker++;
  7116.             break;
  7117.         case 11: //
  7118.         }
  7119.  
  7120.     } while (effect == 0)
  7121. }
  7122. #else
  7123. NAKED
  7124. void atk49_moveend(void)
  7125. {
  7126.     asm(".syntax unified\n\
  7127.    push {r4-r7,lr}\n\
  7128.    mov r7, r10\n\
  7129.    mov r6, r9\n\
  7130.    mov r5, r8\n\
  7131.    push {r5-r7}\n\
  7132.    sub sp, 0x18\n\
  7133.    movs r0, 0\n\
  7134.    mov r10, r0\n\
  7135.    ldr r0, _08021834 @ =gBattlescriptCurrInstr\n\
  7136.    ldr r0, [r0]\n\
  7137.    ldrb r1, [r0, 0x1]\n\
  7138.    str r1, [sp, 0x10]\n\
  7139.    ldrb r0, [r0, 0x2]\n\
  7140.    str r0, [sp, 0x14]\n\
  7141.    ldr r1, _08021838 @ =gBattleMons\n\
  7142.    ldr r0, _0802183C @ =gBankAttacker\n\
  7143.    ldrb r2, [r0]\n\
  7144.    movs r0, 0x58\n\
  7145.    muls r0, r2\n\
  7146.    adds r1, r0, r1\n\
  7147.    ldrh r0, [r1, 0x2E]\n\
  7148.    cmp r0, 0xAF\n\
  7149.    bne _08021844\n\
  7150.    ldr r1, _08021840 @ =gEnigmaBerries\n\
  7151.    lsls r0, r2, 3\n\
  7152.    subs r0, r2\n\
  7153.    lsls r0, 2\n\
  7154.    adds r0, r1\n\
  7155.    ldrb r0, [r0, 0x7]\n\
  7156.    b _0802184E\n\
  7157.    .align 2, 0\n\
  7158. _08021834: .4byte gBattlescriptCurrInstr\n\
  7159. _08021838: .4byte gBattleMons\n\
  7160. _0802183C: .4byte gBankAttacker\n\
  7161. _08021840: .4byte gEnigmaBerries\n\
  7162. _08021844:\n\
  7163.    ldrh r0, [r1, 0x2E]\n\
  7164.    bl ItemId_GetHoldEffect\n\
  7165.    lsls r0, 24\n\
  7166.    lsrs r0, 24\n\
  7167. _0802184E:\n\
  7168.    str r0, [sp, 0x8]\n\
  7169.    ldr r0, _0802186C @ =gBankAttacker\n\
  7170.    ldrb r1, [r0]\n\
  7171.    lsls r1, 1\n\
  7172.    ldr r0, _08021870 @ =gSharedMem + 0x160E8\n\
  7173.    adds r1, r0\n\
  7174.    str r1, [sp, 0xC]\n\
  7175.    subs r0, 0xCC\n\
  7176.    ldrb r0, [r0]\n\
  7177.    cmp r0, 0\n\
  7178.    beq _080218C0\n\
  7179.    movs r2, 0x3F\n\
  7180.    ands r2, r0\n\
  7181.    str r2, [sp, 0x4]\n\
  7182.    b _080218D2\n\
  7183.    .align 2, 0\n\
  7184. _0802186C: .4byte gBankAttacker\n\
  7185. _08021870: .4byte gSharedMem + 0x160E8\n\
  7186. _08021874:\n\
  7187.    strb r2, [r7]\n\
  7188.    ldr r0, [r5]\n\
  7189.    orrs r0, r6\n\
  7190.    str r0, [r5]\n\
  7191.    ldr r0, _080218AC @ =gSharedMem\n\
  7192.    ldr r3, _080218B0 @ =0x0001600c\n\
  7193.    adds r0, r3\n\
  7194.    strb r4, [r0]\n\
  7195.    bl MoveValuesCleanUp\n\
  7196.    ldr r2, _080218B4 @ =gBattleScriptsForMoveEffects\n\
  7197.    mov r4, r8\n\
  7198.    ldrh r1, [r4]\n\
  7199.    lsls r0, r1, 1\n\
  7200.    adds r0, r1\n\
  7201.    lsls r0, 2\n\
  7202.    add r0, r9\n\
  7203.    ldrb r0, [r0]\n\
  7204.    lsls r0, 2\n\
  7205.    adds r0, r2\n\
  7206.    ldr r0, [r0]\n\
  7207.    bl BattleScriptPush\n\
  7208.    ldr r1, _080218B8 @ =gBattlescriptCurrInstr\n\
  7209.    ldr r0, _080218BC @ =gUnknown_081D9B2D\n\
  7210.    bl _0802229C\n\
  7211.    .align 2, 0\n\
  7212. _080218AC: .4byte gSharedMem\n\
  7213. _080218B0: .4byte 0x0001600c\n\
  7214. _080218B4: .4byte gBattleScriptsForMoveEffects\n\
  7215. _080218B8: .4byte gBattlescriptCurrInstr\n\
  7216. _080218BC: .4byte gUnknown_081D9B2D\n\
  7217. _080218C0:\n\
  7218.    ldr r2, _080218D8 @ =gBattleMoves\n\
  7219.    ldr r0, _080218DC @ =gCurrentMove\n\
  7220.    ldrh r1, [r0]\n\
  7221.    lsls r0, r1, 1\n\
  7222.    adds r0, r1\n\
  7223.    lsls r0, 2\n\
  7224.    adds r0, r2\n\
  7225.    ldrb r0, [r0, 0x2]\n\
  7226.    str r0, [sp, 0x4]\n\
  7227. _080218D2:\n\
  7228.    ldr r5, _080218E0 @ =gSharedMem\n\
  7229.    mov r12, r5\n\
  7230.    b _080218EE\n\
  7231.    .align 2, 0\n\
  7232. _080218D8: .4byte gBattleMoves\n\
  7233. _080218DC: .4byte gCurrentMove\n\
  7234. _080218E0: .4byte gSharedMem\n\
  7235. _080218E4:\n\
  7236.    mov r0, r10\n\
  7237.    cmp r0, 0\n\
  7238.    beq _080218EE\n\
  7239.    bl _08022286\n\
  7240. _080218EE:\n\
  7241.    ldr r0, _08021908 @ =0x0001600c\n\
  7242.    add r0, r12\n\
  7243.    ldrb r0, [r0]\n\
  7244.    cmp r0, 0x11\n\
  7245.    bls _080218FC\n\
  7246.    bl _0802224E\n\
  7247. _080218FC:\n\
  7248.    lsls r0, 2\n\
  7249.    ldr r1, _0802190C @ =_08021910\n\
  7250.    adds r0, r1\n\
  7251.    ldr r0, [r0]\n\
  7252.    mov pc, r0\n\
  7253.    .align 2, 0\n\
  7254. _08021908: .4byte 0x0001600c\n\
  7255. _0802190C: .4byte _08021910\n\
  7256.    .align 2, 0\n\
  7257. _08021910:\n\
  7258.    .4byte _08021958\n\
  7259.    .4byte _08021A34\n\
  7260.    .4byte _08021AF0\n\
  7261.    .4byte _08021B20\n\
  7262.    .4byte _08021B44\n\
  7263.    .4byte _08021B78\n\
  7264.    .4byte _08021B9C\n\
  7265.    .4byte _08021C40\n\
  7266.    .4byte _08021C78\n\
  7267.    .4byte _08021CA8\n\
  7268.    .4byte _08021CCC\n\
  7269.    .4byte _08021D18\n\
  7270.    .4byte _08021DAC\n\
  7271.    .4byte _08021E30\n\
  7272.    .4byte _08021E70\n\
  7273.    .4byte _08022068\n\
  7274.    .4byte _080221C0\n\
  7275.    .4byte _0802224E\n\
  7276. _08021958:\n\
  7277.    ldr r5, _08021A08 @ =gBattleMons\n\
  7278.    ldr r2, _08021A0C @ =gBankTarget\n\
  7279.    ldrb r4, [r2]\n\
  7280.    movs r6, 0x58\n\
  7281.    adds r3, r4, 0\n\
  7282.    muls r3, r6\n\
  7283.    adds r0, r5, 0\n\
  7284.    adds r0, 0x50\n\
  7285.    adds r0, r3, r0\n\
  7286.    ldr r1, [r0]\n\
  7287.    movs r0, 0x80\n\
  7288.    lsls r0, 16\n\
  7289.    ands r1, r0\n\
  7290.    cmp r1, 0\n\
  7291.    beq _080219FE\n\
  7292.    adds r0, r3, r5\n\
  7293.    ldrh r0, [r0, 0x28]\n\
  7294.    cmp r0, 0\n\
  7295.    beq _080219FE\n\
  7296.    ldr r0, _08021A10 @ =gBankAttacker\n\
  7297.    ldrb r1, [r0]\n\
  7298.    cmp r1, r4\n\
  7299.    beq _080219FE\n\
  7300.    adds r0, r1, 0\n\
  7301.    bl GetBattlerSide\n\
  7302.    adds r4, r0, 0\n\
  7303.    ldr r1, _08021A0C @ =gBankTarget\n\
  7304.    ldrb r0, [r1]\n\
  7305.    bl GetBattlerSide\n\
  7306.    lsls r4, 24\n\
  7307.    lsls r0, 24\n\
  7308.    cmp r4, r0\n\
  7309.    beq _080219FE\n\
  7310.    ldr r0, _08021A14 @ =gMoveResultFlags\n\
  7311.    ldrb r1, [r0]\n\
  7312.    movs r0, 0x29\n\
  7313.    ands r0, r1\n\
  7314.    cmp r0, 0\n\
  7315.    bne _080219FE\n\
  7316.    ldr r2, _08021A18 @ =gProtectStructs\n\
  7317.    ldr r4, _08021A0C @ =gBankTarget\n\
  7318.    ldrb r3, [r4]\n\
  7319.    lsls r1, r3, 4\n\
  7320.    adds r0, r2, 0x4\n\
  7321.    adds r0, r1, r0\n\
  7322.    ldr r0, [r0]\n\
  7323.    cmp r0, 0\n\
  7324.    bne _080219C8\n\
  7325.    adds r0, r2, 0\n\
  7326.    adds r0, 0x8\n\
  7327.    adds r0, r1, r0\n\
  7328.    ldr r0, [r0]\n\
  7329.    cmp r0, 0\n\
  7330.    beq _080219FE\n\
  7331. _080219C8:\n\
  7332.    ldr r2, _08021A1C @ =gBattleMoves\n\
  7333.    ldr r0, _08021A20 @ =gCurrentMove\n\
  7334.    ldrh r1, [r0]\n\
  7335.    lsls r0, r1, 1\n\
  7336.    adds r0, r1\n\
  7337.    lsls r0, 2\n\
  7338.    adds r0, r2\n\
  7339.    ldrb r0, [r0, 0x1]\n\
  7340.    cmp r0, 0\n\
  7341.    beq _080219FE\n\
  7342.    adds r0, r3, 0\n\
  7343.    muls r0, r6\n\
  7344.    adds r1, r0, r5\n\
  7345.    ldrb r2, [r1, 0x19]\n\
  7346.    movs r0, 0x19\n\
  7347.    ldrsb r0, [r1, r0]\n\
  7348.    cmp r0, 0xB\n\
  7349.    bgt _080219FE\n\
  7350.    adds r0, r2, 0x1\n\
  7351.    strb r0, [r1, 0x19]\n\
  7352.    bl BattleScriptPushCursor\n\
  7353.    ldr r1, _08021A24 @ =gBattlescriptCurrInstr\n\
  7354.    ldr r0, _08021A28 @ =BattleScript_RageIsBuilding\n\
  7355.    str r0, [r1]\n\
  7356.    movs r5, 0x1\n\
  7357.    mov r10, r5\n\
  7358. _080219FE:\n\
  7359.    ldr r2, _08021A2C @ =gSharedMem\n\
  7360.    ldr r0, _08021A30 @ =0x0001600c\n\
  7361.    adds r1, r2, r0\n\
  7362.    b _08021E00\n\
  7363.    .align 2, 0\n\
  7364. _08021A08: .4byte gBattleMons\n\
  7365. _08021A0C: .4byte gBankTarget\n\
  7366. _08021A10: .4byte gBankAttacker\n\
  7367. _08021A14: .4byte gMoveResultFlags\n\
  7368. _08021A18: .4byte gProtectStructs\n\
  7369. _08021A1C: .4byte gBattleMoves\n\
  7370. _08021A20: .4byte gCurrentMove\n\
  7371. _08021A24: .4byte gBattlescriptCurrInstr\n\
  7372. _08021A28: .4byte BattleScript_RageIsBuilding\n\
  7373. _08021A2C: .4byte gSharedMem\n\
  7374. _08021A30: .4byte 0x0001600c\n\
  7375. _08021A34:\n\
  7376.    ldr r2, _08021AD0 @ =gBattleMons\n\
  7377.    ldr r1, _08021AD4 @ =gBankTarget\n\
  7378.    ldrb r4, [r1]\n\
  7379.    movs r3, 0x58\n\
  7380.    mov r12, r3\n\
  7381.    mov r3, r12\n\
  7382.    muls r3, r4\n\
  7383.    adds r7, r2, 0\n\
  7384.    adds r7, 0x4C\n\
  7385.    adds r6, r3, r7\n\
  7386.    ldr r5, [r6]\n\
  7387.    movs r0, 0x20\n\
  7388.    ands r0, r5\n\
  7389.    cmp r0, 0\n\
  7390.    bne _08021A54\n\
  7391.    b _08021DFA\n\
  7392. _08021A54:\n\
  7393.    adds r0, r3, r2\n\
  7394.    ldrh r0, [r0, 0x28]\n\
  7395.    cmp r0, 0\n\
  7396.    bne _08021A5E\n\
  7397.    b _08021DFA\n\
  7398. _08021A5E:\n\
  7399.    ldr r0, _08021AD8 @ =gBankAttacker\n\
  7400.    ldrb r0, [r0]\n\
  7401.    cmp r0, r4\n\
  7402.    bne _08021A68\n\
  7403.    b _08021DFA\n\
  7404. _08021A68:\n\
  7405.    ldr r0, _08021ADC @ =gSpecialStatuses\n\
  7406.    lsls r1, r4, 2\n\
  7407.    adds r1, r4\n\
  7408.    lsls r1, 2\n\
  7409.    adds r0, 0xC\n\
  7410.    adds r1, r0\n\
  7411.    ldr r0, [r1]\n\
  7412.    cmp r0, 0\n\
  7413.    bne _08021A7C\n\
  7414.    b _08021DFA\n\
  7415. _08021A7C:\n\
  7416.    ldr r0, _08021AE0 @ =gMoveResultFlags\n\
  7417.    ldrb r1, [r0]\n\
  7418.    movs r0, 0x29\n\
  7419.    ands r0, r1\n\
  7420.    cmp r0, 0\n\
  7421.    beq _08021A8A\n\
  7422.    b _08021DFA\n\
  7423. _08021A8A:\n\
  7424.    ldr r4, [sp, 0x4]\n\
  7425.    cmp r4, 0xA\n\
  7426.    beq _08021A92\n\
  7427.    b _08021DFA\n\
  7428. _08021A92:\n\
  7429.    movs r0, 0x21\n\
  7430.    negs r0, r0\n\
  7431.    ands r5, r0\n\
  7432.    str r5, [r6]\n\
  7433.    ldr r4, _08021AE4 @ =gActiveBattler\n\
  7434.    ldr r5, _08021AD4 @ =gBankTarget\n\
  7435.    ldrb r0, [r5]\n\
  7436.    strb r0, [r4]\n\
  7437.    ldrb r0, [r5]\n\
  7438.    mov r1, r12\n\
  7439.    muls r1, r0\n\
  7440.    adds r0, r1, 0\n\
  7441.    adds r0, r7\n\
  7442.    str r0, [sp]\n\
  7443.    movs r0, 0\n\
  7444.    movs r1, 0x28\n\
  7445.    movs r2, 0\n\
  7446.    movs r3, 0x4\n\
  7447.    bl EmitSetMonData\n\
  7448.    ldrb r0, [r4]\n\
  7449.    bl MarkBufferBankForExecution\n\
  7450.    bl BattleScriptPushCursor\n\
  7451.    ldr r1, _08021AE8 @ =gBattlescriptCurrInstr\n\
  7452.    ldr r0, _08021AEC @ =BattleScript_DefrostedViaFireMove\n\
  7453.    str r0, [r1]\n\
  7454.    movs r2, 0x1\n\
  7455.    mov r10, r2\n\
  7456.    b _08021DFA\n\
  7457.    .align 2, 0\n\
  7458. _08021AD0: .4byte gBattleMons\n\
  7459. _08021AD4: .4byte gBankTarget\n\
  7460. _08021AD8: .4byte gBankAttacker\n\
  7461. _08021ADC: .4byte gSpecialStatuses\n\
  7462. _08021AE0: .4byte gMoveResultFlags\n\
  7463. _08021AE4: .4byte gActiveBattler\n\
  7464. _08021AE8: .4byte gBattlescriptCurrInstr\n\
  7465. _08021AEC: .4byte BattleScript_DefrostedViaFireMove\n\
  7466. _08021AF0:\n\
  7467.    ldr r0, _08021B14 @ =gBankTarget\n\
  7468.    ldrb r1, [r0]\n\
  7469.    movs r0, 0\n\
  7470.    str r0, [sp]\n\
  7471.    movs r0, 0x7\n\
  7472.    movs r2, 0\n\
  7473.    movs r3, 0\n\
  7474.    bl AbilityBattleEffects\n\
  7475.    lsls r0, 24\n\
  7476.    cmp r0, 0\n\
  7477.    beq _08021B0C\n\
  7478.    movs r4, 0x1\n\
  7479.    mov r10, r4\n\
  7480. _08021B0C:\n\
  7481.    ldr r2, _08021B18 @ =gSharedMem\n\
  7482.    ldr r5, _08021B1C @ =0x0001600c\n\
  7483.    adds r1, r2, r5\n\
  7484.    b _08021E00\n\
  7485.    .align 2, 0\n\
  7486. _08021B14: .4byte gBankTarget\n\
  7487. _08021B18: .4byte gSharedMem\n\
  7488. _08021B1C: .4byte 0x0001600c\n\
  7489. _08021B20:\n\
  7490.    ldr r0, _08021B40 @ =gBankTarget\n\
  7491.    ldrb r1, [r0]\n\
  7492.    movs r0, 0\n\
  7493.    str r0, [sp]\n\
  7494.    movs r0, 0x4\n\
  7495.    movs r2, 0\n\
  7496.    movs r3, 0\n\
  7497.    bl AbilityBattleEffects\n\
  7498.    lsls r0, 24\n\
  7499.    cmp r0, 0\n\
  7500.    bne _08021B3A\n\
  7501.    b _08021DFA\n\
  7502. _08021B3A:\n\
  7503.    movs r0, 0x1\n\
  7504.    mov r10, r0\n\
  7505.    b _08021DFA\n\
  7506.    .align 2, 0\n\
  7507. _08021B40: .4byte gBankTarget\n\
  7508. _08021B44:\n\
  7509.    movs r0, 0\n\
  7510.    str r0, [sp]\n\
  7511.    movs r0, 0x5\n\
  7512.    movs r1, 0\n\
  7513.    movs r2, 0\n\
  7514.    movs r3, 0\n\
  7515.    bl AbilityBattleEffects\n\
  7516.    lsls r0, 24\n\
  7517.    cmp r0, 0\n\
  7518.    beq _08021B68\n\
  7519.    movs r4, 0x1\n\
  7520.    mov r10, r4\n\
  7521.    ldr r5, _08021B64 @ =gSharedMem\n\
  7522.    mov r12, r5\n\
  7523.    b _0802224E\n\
  7524.    .align 2, 0\n\
  7525. _08021B64: .4byte gSharedMem\n\
  7526. _08021B68:\n\
  7527.    ldr r2, _08021B70 @ =gSharedMem\n\
  7528.    ldr r0, _08021B74 @ =0x0001600c\n\
  7529.    adds r1, r2, r0\n\
  7530.    b _08021E00\n\
  7531.    .align 2, 0\n\
  7532. _08021B70: .4byte gSharedMem\n\
  7533. _08021B74: .4byte 0x0001600c\n\
  7534. _08021B78:\n\
  7535.    ldr r0, _08021B98 @ =gBankAttacker\n\
  7536.    ldrb r1, [r0]\n\
  7537.    movs r0, 0\n\
  7538.    str r0, [sp]\n\
  7539.    movs r0, 0x8\n\
  7540.    movs r2, 0\n\
  7541.    movs r3, 0\n\
  7542.    bl AbilityBattleEffects\n\
  7543.    lsls r0, 24\n\
  7544.    cmp r0, 0\n\
  7545.    bne _08021B92\n\
  7546.    b _08021DFA\n\
  7547. _08021B92:\n\
  7548.    movs r1, 0x1\n\
  7549.    mov r10, r1\n\
  7550.    b _08021DFA\n\
  7551.    .align 2, 0\n\
  7552. _08021B98: .4byte gBankAttacker\n\
  7553. _08021B9C:\n\
  7554.    ldr r0, _08021C28 @ =gHitMarker\n\
  7555.    ldr r0, [r0]\n\
  7556.    movs r1, 0x80\n\
  7557.    lsls r1, 18\n\
  7558.    ands r0, r1\n\
  7559.    cmp r0, 0\n\
  7560.    beq _08021BE0\n\
  7561.    ldr r4, [sp, 0x8]\n\
  7562.    cmp r4, 0x1D\n\
  7563.    bne _08021BE0\n\
  7564.    ldr r0, _08021C2C @ =gChosenMove\n\
  7565.    ldrh r2, [r0]\n\
  7566.    adds r7, r0, 0\n\
  7567.    cmp r2, 0xA5\n\
  7568.    beq _08021BE0\n\
  7569.    ldr r5, [sp, 0xC]\n\
  7570.    ldrh r1, [r5]\n\
  7571.    cmp r1, 0\n\
  7572.    beq _08021BC8\n\
  7573.    ldr r0, _08021C30 @ =0x0000ffff\n\
  7574.    cmp r1, r0\n\
  7575.    bne _08021BE0\n\
  7576. _08021BC8:\n\
  7577.    cmp r2, 0xE2\n\
  7578.    bne _08021BDA\n\
  7579.    ldr r0, _08021C34 @ =gMoveResultFlags\n\
  7580.    ldrb r1, [r0]\n\
  7581.    movs r0, 0x20\n\
  7582.    ands r0, r1\n\
  7583.    cmp r0, 0\n\
  7584.    bne _08021BDA\n\
  7585.    b _08022244\n\
  7586. _08021BDA:\n\
  7587.    ldrh r0, [r7]\n\
  7588.    ldr r1, [sp, 0xC]\n\
  7589.    strh r0, [r1]\n\
  7590. _08021BE0:\n\
  7591.    movs r4, 0\n\
  7592.    ldr r2, _08021C38 @ =gBattleMons\n\
  7593.    ldr r3, _08021C3C @ =gBankAttacker\n\
  7594.    ldrb r1, [r3]\n\
  7595.    movs r0, 0x58\n\
  7596.    muls r0, r1\n\
  7597.    adds r2, 0xC\n\
  7598.    adds r0, r2\n\
  7599.    ldrh r0, [r0]\n\
  7600.    ldr r5, [sp, 0xC]\n\
  7601.    ldrh r1, [r5]\n\
  7602.    mov r9, r3\n\
  7603.    cmp r0, r1\n\
  7604.    beq _08021C18\n\
  7605.    mov r6, r9\n\
  7606.    movs r3, 0x58\n\
  7607.    adds r5, r1, 0\n\
  7608. _08021C02:\n\
  7609.    adds r4, 0x1\n\
  7610.    cmp r4, 0x3\n\
  7611.    bgt _08021C18\n\
  7612.    lsls r0, r4, 1\n\
  7613.    ldrb r1, [r6]\n\
  7614.    muls r1, r3\n\
  7615.    adds r0, r1\n\
  7616.    adds r0, r2\n\
  7617.    ldrh r0, [r0]\n\
  7618.    cmp r0, r5\n\
  7619.    bne _08021C02\n\
  7620. _08021C18:\n\
  7621.    cmp r4, 0x4\n\
  7622.    beq _08021C1E\n\
  7623.    b _08022244\n\
  7624. _08021C1E:\n\
  7625.    movs r0, 0\n\
  7626.    ldr r1, [sp, 0xC]\n\
  7627. _08021C22:\n\
  7628.    strh r0, [r1]\n\
  7629.    b _08022244\n\
  7630.    .align 2, 0\n\
  7631. _08021C28: .4byte gHitMarker\n\
  7632. _08021C2C: .4byte gChosenMove\n\
  7633. _08021C30: .4byte 0x0000ffff\n\
  7634. _08021C34: .4byte gMoveResultFlags\n\
  7635. _08021C38: .4byte gBattleMons\n\
  7636. _08021C3C: .4byte gBankAttacker\n\
  7637. _08021C40:\n\
  7638.    movs r4, 0\n\
  7639.    ldr r0, _08021C6C @ =gBattlersCount\n\
  7640.    ldrb r2, [r0]\n\
  7641.    cmp r4, r2\n\
  7642.    blt _08021C4C\n\
  7643.    b _08022244\n\
  7644. _08021C4C:\n\
  7645.    movs r5, 0\n\
  7646.    ldr r2, _08021C70 @ =gSharedMem + 0x160F0\n\
  7647.    ldr r3, _08021C74 @ =gBattleMons\n\
  7648. _08021C52:\n\
  7649.    ldrh r1, [r2]\n\
  7650.    cmp r1, 0\n\
  7651.    beq _08021C5C\n\
  7652.    strh r1, [r3, 0x2E]\n\
  7653.    strh r5, [r2]\n\
  7654. _08021C5C:\n\
  7655.    adds r2, 0x2\n\
  7656.    adds r3, 0x58\n\
  7657.    adds r4, 0x1\n\
  7658.    ldrb r1, [r0]\n\
  7659.    cmp r4, r1\n\
  7660.    blt _08021C52\n\
  7661.    b _08022244\n\
  7662.    .align 2, 0\n\
  7663. _08021C6C: .4byte gBattlersCount\n\
  7664. _08021C70: .4byte gSharedMem + 0x160F0\n\
  7665. _08021C74: .4byte gBattleMons\n\
  7666. _08021C78:\n\
  7667.    movs r0, 0x3\n\
  7668.    movs r1, 0\n\
  7669.    movs r2, 0\n\
  7670.    bl ItemBattleEffects\n\
  7671.    lsls r0, 24\n\
  7672.    cmp r0, 0\n\
  7673.    beq _08021C98\n\
  7674.    movs r2, 0x1\n\
  7675.    mov r10, r2\n\
  7676.    ldr r3, _08021C94 @ =gSharedMem\n\
  7677.    mov r12, r3\n\
  7678.    b _0802224E\n\
  7679.    .align 2, 0\n\
  7680. _08021C94: .4byte gSharedMem\n\
  7681. _08021C98:\n\
  7682.    ldr r2, _08021CA0 @ =gSharedMem\n\
  7683.    ldr r4, _08021CA4 @ =0x0001600c\n\
  7684.    adds r1, r2, r4\n\
  7685.    b _08021E00\n\
  7686.    .align 2, 0\n\
  7687. _08021CA0: .4byte gSharedMem\n\
  7688. _08021CA4: .4byte 0x0001600c\n\
  7689. _08021CA8:\n\
  7690.    movs r0, 0x4\n\
  7691.    movs r1, 0\n\
  7692.    movs r2, 0\n\
  7693.    bl ItemBattleEffects\n\
  7694.    lsls r0, 24\n\
  7695.    cmp r0, 0\n\
  7696.    beq _08021CBC\n\
  7697.    movs r5, 0x1\n\
  7698.    mov r10, r5\n\
  7699. _08021CBC:\n\
  7700.    ldr r2, _08021CC4 @ =gSharedMem\n\
  7701.    ldr r0, _08021CC8 @ =0x0001600c\n\
  7702.    adds r1, r2, r0\n\
  7703.    b _08021E00\n\
  7704.    .align 2, 0\n\
  7705. _08021CC4: .4byte gSharedMem\n\
  7706. _08021CC8: .4byte 0x0001600c\n\
  7707. _08021CCC:\n\
  7708.    ldr r1, _08021D04 @ =gStatuses3\n\
  7709.    ldr r0, _08021D08 @ =gBankAttacker\n\
  7710.    ldrb r2, [r0]\n\
  7711.    lsls r0, r2, 2\n\
  7712.    adds r0, r1\n\
  7713.    ldr r0, [r0]\n\
  7714.    ldr r1, _08021D0C @ =0x000400c0\n\
  7715.    ands r0, r1\n\
  7716.    cmp r0, 0\n\
  7717.    bne _08021CE2\n\
  7718.    b _08021DFA\n\
  7719. _08021CE2:\n\
  7720.    ldr r0, _08021D10 @ =gHitMarker\n\
  7721.    ldr r0, [r0]\n\
  7722.    movs r1, 0x80\n\
  7723.    ands r0, r1\n\
  7724.    cmp r0, 0\n\
  7725.    bne _08021CF0\n\
  7726.    b _08021DFA\n\
  7727. _08021CF0:\n\
  7728.    ldr r4, _08021D14 @ =gActiveBattler\n\
  7729.    strb r2, [r4]\n\
  7730.    movs r0, 0\n\
  7731.    movs r1, 0x1\n\
  7732.    bl EmitSpriteInvisibility\n\
  7733.    ldrb r0, [r4]\n\
  7734.    bl MarkBufferBankForExecution\n\
  7735.    b _08021DFA\n\
  7736.    .align 2, 0\n\
  7737. _08021D04: .4byte gStatuses3\n\
  7738. _08021D08: .4byte gBankAttacker\n\
  7739. _08021D0C: .4byte 0x000400c0\n\
  7740. _08021D10: .4byte gHitMarker\n\
  7741. _08021D14: .4byte gActiveBattler\n\
  7742. _08021D18:\n\
  7743.    ldr r0, _08021D88 @ =gMoveResultFlags\n\
  7744.    ldrb r1, [r0]\n\
  7745.    movs r0, 0x29\n\
  7746.    ands r0, r1\n\
  7747.    cmp r0, 0\n\
  7748.    bne _08021D44\n\
  7749.    ldr r1, _08021D8C @ =gStatuses3\n\
  7750.    ldr r0, _08021D90 @ =gBankAttacker\n\
  7751.    ldrb r2, [r0]\n\
  7752.    lsls r0, r2, 2\n\
  7753.    adds r0, r1\n\
  7754.    ldr r0, [r0]\n\
  7755.    ldr r1, _08021D94 @ =0x000400c0\n\
  7756.    ands r0, r1\n\
  7757.    cmp r0, 0\n\
  7758.    beq _08021D44\n\
  7759.    adds r0, r2, 0\n\
  7760.    bl WasUnableToUseMove\n\
  7761.    lsls r0, 24\n\
  7762.    cmp r0, 0\n\
  7763.    beq _08021D7E\n\
  7764. _08021D44:\n\
  7765.    ldr r4, _08021D98 @ =gActiveBattler\n\
  7766.    ldr r5, _08021D90 @ =gBankAttacker\n\
  7767.    ldrb r0, [r5]\n\
  7768.    strb r0, [r4]\n\
  7769.    movs r0, 0\n\
  7770.    movs r1, 0\n\
  7771.    bl EmitSpriteInvisibility\n\
  7772.    ldrb r0, [r4]\n\
  7773.    bl MarkBufferBankForExecution\n\
  7774.    ldr r0, _08021D8C @ =gStatuses3\n\
  7775.    ldrb r2, [r5]\n\
  7776.    lsls r2, 2\n\
  7777.    adds r2, r0\n\
  7778.    ldr r0, [r2]\n\
  7779.    ldr r1, _08021D9C @ =0xfffbff3f\n\
  7780.    ands r0, r1\n\
  7781.    str r0, [r2]\n\
  7782.    ldr r2, _08021DA0 @ =gSpecialStatuses\n\
  7783.    ldrb r1, [r5]\n\
  7784.    lsls r0, r1, 2\n\
  7785.    adds r0, r1\n\
  7786.    lsls r0, 2\n\
  7787.    adds r0, r2\n\
  7788.    ldrb r1, [r0]\n\
  7789.    movs r2, 0x4\n\
  7790.    orrs r1, r2\n\
  7791.    strb r1, [r0]\n\
  7792. _08021D7E:\n\
  7793.    ldr r2, _08021DA4 @ =gSharedMem\n\
  7794.    ldr r4, _08021DA8 @ =0x0001600c\n\
  7795.    adds r1, r2, r4\n\
  7796.    b _08021E00\n\
  7797.    .align 2, 0\n\
  7798. _08021D88: .4byte gMoveResultFlags\n\
  7799. _08021D8C: .4byte gStatuses3\n\
  7800. _08021D90: .4byte gBankAttacker\n\
  7801. _08021D94: .4byte 0x000400c0\n\
  7802. _08021D98: .4byte gActiveBattler\n\
  7803. _08021D9C: .4byte 0xfffbff3f\n\
  7804. _08021DA0: .4byte gSpecialStatuses\n\
  7805. _08021DA4: .4byte gSharedMem\n\
  7806. _08021DA8: .4byte 0x0001600c\n\
  7807. _08021DAC:\n\
  7808.    ldr r2, _08021E0C @ =gSpecialStatuses\n\
  7809.    ldr r1, _08021E10 @ =gBankTarget\n\
  7810.    ldrb r3, [r1]\n\
  7811.    lsls r4, r3, 2\n\
  7812.    adds r0, r4, r3\n\
  7813.    lsls r0, 2\n\
  7814.    adds r0, r2\n\
  7815.    ldrb r0, [r0]\n\
  7816.    lsls r0, 29\n\
  7817.    cmp r0, 0\n\
  7818.    blt _08021DFA\n\
  7819.    ldr r0, _08021E14 @ =gBattlersCount\n\
  7820.    ldrb r0, [r0]\n\
  7821.    cmp r3, r0\n\
  7822.    bcs _08021DFA\n\
  7823.    ldr r5, _08021E18 @ =gStatuses3\n\
  7824.    adds r0, r4, r5\n\
  7825.    ldr r0, [r0]\n\
  7826.    ldr r1, _08021E1C @ =0x000400c0\n\
  7827.    ands r0, r1\n\
  7828.    cmp r0, 0\n\
  7829.    bne _08021DFA\n\
  7830.    ldr r4, _08021E20 @ =gActiveBattler\n\
  7831.    strb r3, [r4]\n\
  7832.    movs r0, 0\n\
  7833.    movs r1, 0\n\
  7834.    bl EmitSpriteInvisibility\n\
  7835.    ldrb r0, [r4]\n\
  7836.    bl MarkBufferBankForExecution\n\
  7837.    ldr r0, _08021E10 @ =gBankTarget\n\
  7838.    ldrb r2, [r0]\n\
  7839.    lsls r2, 2\n\
  7840.    adds r2, r5\n\
  7841.    ldr r0, [r2]\n\
  7842.    ldr r1, _08021E24 @ =0xfffbff3f\n\
  7843.    ands r0, r1\n\
  7844.    str r0, [r2]\n\
  7845. _08021DFA:\n\
  7846.    ldr r2, _08021E28 @ =gSharedMem\n\
  7847.    ldr r3, _08021E2C @ =0x0001600c\n\
  7848.    adds r1, r2, r3\n\
  7849. _08021E00:\n\
  7850.    ldrb r0, [r1]\n\
  7851.    adds r0, 0x1\n\
  7852.    strb r0, [r1]\n\
  7853.    mov r12, r2\n\
  7854.    b _0802224E\n\
  7855.    .align 2, 0\n\
  7856. _08021E0C: .4byte gSpecialStatuses\n\
  7857. _08021E10: .4byte gBankTarget\n\
  7858. _08021E14: .4byte gBattlersCount\n\
  7859. _08021E18: .4byte gStatuses3\n\
  7860. _08021E1C: .4byte 0x000400c0\n\
  7861. _08021E20: .4byte gActiveBattler\n\
  7862. _08021E24: .4byte 0xfffbff3f\n\
  7863. _08021E28: .4byte gSharedMem\n\
  7864. _08021E2C: .4byte 0x0001600c\n\
  7865. _08021E30:\n\
  7866.    movs r4, 0\n\
  7867.    ldr r0, _08021E60 @ =gBattlersCount\n\
  7868.    ldrb r5, [r0]\n\
  7869.    cmp r4, r5\n\
  7870.    blt _08021E3C\n\
  7871.    b _08022244\n\
  7872. _08021E3C:\n\
  7873.    ldr r2, _08021E64 @ =gDisableStructs\n\
  7874.    ldr r5, _08021E68 @ =0xfeffffff\n\
  7875.    adds r3, r0, 0\n\
  7876.    ldr r1, _08021E6C @ =gBattleMons+0x50\n\
  7877. _08021E44:\n\
  7878.    ldrb r0, [r2, 0xA]\n\
  7879.    cmp r0, 0\n\
  7880.    bne _08021E50\n\
  7881.    ldr r0, [r1]\n\
  7882.    ands r0, r5\n\
  7883.    str r0, [r1]\n\
  7884. _08021E50:\n\
  7885.    adds r2, 0x1C\n\
  7886.    adds r1, 0x58\n\
  7887.    adds r4, 0x1\n\
  7888.    ldrb r0, [r3]\n\
  7889.    cmp r4, r0\n\
  7890.    blt _08021E44\n\
  7891.    b _08022244\n\
  7892.    .align 2, 0\n\
  7893. _08021E60: .4byte gBattlersCount\n\
  7894. _08021E64: .4byte gDisableStructs\n\
  7895. _08021E68: .4byte 0xfeffffff\n\
  7896. _08021E6C: .4byte gBattleMons+0x50\n\
  7897. _08021E70:\n\
  7898.    ldr r1, _08021F2C @ =gHitMarker\n\
  7899.    ldr r3, [r1]\n\
  7900.    movs r0, 0x80\n\
  7901.    lsls r0, 5\n\
  7902.    ands r0, r3\n\
  7903.    ldr r2, _08021F30 @ =gBankAttacker\n\
  7904.    mov r9, r2\n\
  7905.    adds r5, r1, 0\n\
  7906.    cmp r0, 0\n\
  7907.    beq _08021E9A\n\
  7908.    ldr r0, _08021F34 @ =gActiveBattler\n\
  7909.    ldrb r2, [r2]\n\
  7910.    strb r2, [r0]\n\
  7911.    ldr r1, _08021F38 @ =gBankTarget\n\
  7912.    ldrb r0, [r1]\n\
  7913.    mov r4, r9\n\
  7914.    strb r0, [r4]\n\
  7915.    strb r2, [r1]\n\
  7916.    ldr r0, _08021F3C @ =0xffffefff\n\
  7917.    ands r3, r0\n\
  7918.    str r3, [r5]\n\
  7919. _08021E9A:\n\
  7920.    ldr r1, _08021F40 @ =gBattleMoves\n\
  7921.    ldr r2, _08021F44 @ =gChosenMove\n\
  7922.    ldrh r3, [r2]\n\
  7923.    lsls r0, r3, 1\n\
  7924.    adds r0, r3\n\
  7925.    lsls r0, 2\n\
  7926.    adds r0, r1\n\
  7927.    ldrb r0, [r0]\n\
  7928.    mov r8, r1\n\
  7929.    adds r7, r2, 0\n\
  7930.    cmp r0, 0x7F\n\
  7931.    bne _08021EBE\n\
  7932.    ldr r0, _08021F48 @ =gMoveResultFlags\n\
  7933.    ldrb r1, [r0]\n\
  7934.    movs r0, 0x29\n\
  7935.    ands r0, r1\n\
  7936.    cmp r0, 0\n\
  7937.    beq _08021ECA\n\
  7938. _08021EBE:\n\
  7939.    ldr r1, _08021F4C @ =gUnknown_02024C2C\n\
  7940.    mov r2, r9\n\
  7941.    ldrb r0, [r2]\n\
  7942.    lsls r0, 1\n\
  7943.    adds r0, r1\n\
  7944.    strh r3, [r0]\n\
  7945. _08021ECA:\n\
  7946.    ldr r0, _08021F50 @ =gAbsentBattlerFlags\n\
  7947.    ldrb r1, [r0]\n\
  7948.    ldr r2, _08021F54 @ =gBitTable\n\
  7949.    mov r3, r9\n\
  7950.    ldrb r4, [r3]\n\
  7951.    lsls r0, r4, 2\n\
  7952.    adds r0, r2\n\
  7953.    ldr r3, [r0]\n\
  7954.    ands r1, r3\n\
  7955.    adds r6, r2, 0\n\
  7956.    cmp r1, 0\n\
  7957.    beq _08021EE4\n\
  7958.    b _08022244\n\
  7959. _08021EE4:\n\
  7960.    ldr r0, _08021F58 @ =0x000160a6\n\
  7961.    add r0, r12\n\
  7962.    ldrb r0, [r0]\n\
  7963.    ands r0, r3\n\
  7964.    cmp r0, 0\n\
  7965.    beq _08021EF2\n\
  7966.    b _08022244\n\
  7967. _08021EF2:\n\
  7968.    ldrh r2, [r7]\n\
  7969.    lsls r0, r2, 1\n\
  7970.    adds r0, r2\n\
  7971.    lsls r0, 2\n\
  7972.    add r0, r8\n\
  7973.    ldrb r0, [r0]\n\
  7974.    cmp r0, 0x7F\n\
  7975.    bne _08021F04\n\
  7976.    b _08022244\n\
  7977. _08021F04:\n\
  7978.    ldr r0, [r5]\n\
  7979.    movs r1, 0x80\n\
  7980.    lsls r1, 18\n\
  7981.    ands r0, r1\n\
  7982.    cmp r0, 0\n\
  7983.    beq _08021F68\n\
  7984.    ldr r1, _08021F5C @ =gLastUsedMove\n\
  7985.    lsls r0, r4, 1\n\
  7986.    adds r0, r1\n\
  7987.    strh r2, [r0]\n\
  7988.    ldr r0, _08021F60 @ =gUnknown_02024C4C\n\
  7989.    mov r4, r9\n\
  7990.    ldrb r1, [r4]\n\
  7991.    lsls r1, 1\n\
  7992.    adds r1, r0\n\
  7993.    ldr r0, _08021F64 @ =gCurrentMove\n\
  7994.    ldrh r0, [r0]\n\
  7995.    strh r0, [r1]\n\
  7996.    b _08021F82\n\
  7997.    .align 2, 0\n\
  7998. _08021F2C: .4byte gHitMarker\n\
  7999. _08021F30: .4byte gBankAttacker\n\
  8000. _08021F34: .4byte gActiveBattler\n\
  8001. _08021F38: .4byte gBankTarget\n\
  8002. _08021F3C: .4byte 0xffffefff\n\
  8003. _08021F40: .4byte gBattleMoves\n\
  8004. _08021F44: .4byte gChosenMove\n\
  8005. _08021F48: .4byte gMoveResultFlags\n\
  8006. _08021F4C: .4byte gUnknown_02024C2C\n\
  8007. _08021F50: .4byte gAbsentBattlerFlags\n\
  8008. _08021F54: .4byte gBitTable\n\
  8009. _08021F58: .4byte 0x000160a6\n\
  8010. _08021F5C: .4byte gLastUsedMove\n\
  8011. _08021F60: .4byte gUnknown_02024C4C\n\
  8012. _08021F64: .4byte gCurrentMove\n\
  8013. _08021F68:\n\
  8014.    ldr r1, _08021FD0 @ =gLastUsedMove\n\
  8015.    lsls r0, r4, 1\n\
  8016.    adds r0, r1\n\
  8017.    ldr r1, _08021FD4 @ =0x0000ffff\n\
  8018.    strh r1, [r0]\n\
  8019.    ldr r1, _08021FD8 @ =gUnknown_02024C4C\n\
  8020.    mov r2, r9\n\
  8021.    ldrb r0, [r2]\n\
  8022.    lsls r0, 1\n\
  8023.    adds r0, r1\n\
  8024.    movs r1, 0x1\n\
  8025.    negs r1, r1\n\
  8026.    strh r1, [r0]\n\
  8027. _08021F82:\n\
  8028.    ldr r2, _08021FDC @ =gBankTarget\n\
  8029.    ldrb r3, [r2]\n\
  8030.    lsls r0, r3, 2\n\
  8031.    adds r0, r6\n\
  8032.    ldr r0, [r0]\n\
  8033.    lsls r0, 28\n\
  8034.    ldr r1, [r5]\n\
  8035.    ands r1, r0\n\
  8036.    cmp r1, 0\n\
  8037.    bne _08021FA0\n\
  8038.    ldr r0, _08021FE0 @ =gLastHitBy\n\
  8039.    adds r0, r3, r0\n\
  8040.    mov r3, r9\n\
  8041.    ldrb r1, [r3]\n\
  8042.    strb r1, [r0]\n\
  8043. _08021FA0:\n\
  8044.    ldr r0, [r5]\n\
  8045.    movs r1, 0x80\n\
  8046.    lsls r1, 18\n\
  8047.    ands r0, r1\n\
  8048.    cmp r0, 0\n\
  8049.    beq _0802204C\n\
  8050.    ldr r0, _08021FE4 @ =gMoveResultFlags\n\
  8051.    ldrb r1, [r0]\n\
  8052.    movs r0, 0x29\n\
  8053.    ands r0, r1\n\
  8054.    cmp r0, 0\n\
  8055.    bne _0802204C\n\
  8056.    ldrh r2, [r7]\n\
  8057.    ldr r0, _08021FD4 @ =0x0000ffff\n\
  8058.    cmp r2, r0\n\
  8059.    bne _08021FEC\n\
  8060.    ldr r1, _08021FE8 @ =gLastLandedMoves\n\
  8061.    ldr r4, _08021FDC @ =gBankTarget\n\
  8062.    ldrb r0, [r4]\n\
  8063.    lsls r0, 1\n\
  8064.    adds r0, r1\n\
  8065.    strh r2, [r0]\n\
  8066.    b _08022244\n\
  8067.    .align 2, 0\n\
  8068. _08021FD0: .4byte gLastUsedMove\n\
  8069. _08021FD4: .4byte 0x0000ffff\n\
  8070. _08021FD8: .4byte gUnknown_02024C4C\n\
  8071. _08021FDC: .4byte gBankTarget\n\
  8072. _08021FE0: .4byte gLastHitBy\n\
  8073. _08021FE4: .4byte gMoveResultFlags\n\
  8074. _08021FE8: .4byte gLastLandedMoves\n\
  8075. _08021FEC:\n\
  8076.    ldr r0, _08022014 @ =gLastLandedMoves\n\
  8077.    ldr r5, _08022018 @ =gBankTarget\n\
  8078.    ldrb r1, [r5]\n\
  8079.    lsls r1, 1\n\
  8080.    adds r1, r0\n\
  8081.    ldr r4, _0802201C @ =gCurrentMove\n\
  8082.    ldrh r0, [r4]\n\
  8083.    strh r0, [r1]\n\
  8084.    ldr r0, _08022020 @ =0x0001601c\n\
  8085.    add r0, r12\n\
  8086.    ldrb r3, [r0]\n\
  8087.    cmp r3, 0\n\
  8088.    beq _08022028\n\
  8089.    ldr r0, _08022024 @ =gLastHitByType\n\
  8090.    ldrb r1, [r5]\n\
  8091.    lsls r1, 1\n\
  8092.    adds r1, r0\n\
  8093.    movs r0, 0x3F\n\
  8094.    ands r0, r3\n\
  8095.    b _08021C22\n\
  8096.    .align 2, 0\n\
  8097. _08022014: .4byte gLastLandedMoves\n\
  8098. _08022018: .4byte gBankTarget\n\
  8099. _0802201C: .4byte gCurrentMove\n\
  8100. _08022020: .4byte 0x0001601c\n\
  8101. _08022024: .4byte gLastHitByType\n\
  8102. _08022028:\n\
  8103.    ldr r0, _08022044 @ =gLastHitByType\n\
  8104.    ldr r1, _08022048 @ =gBankTarget\n\
  8105.    ldrb r2, [r1]\n\
  8106.    lsls r2, 1\n\
  8107.    adds r2, r0\n\
  8108.    ldrh r1, [r4]\n\
  8109.    lsls r0, r1, 1\n\
  8110.    adds r0, r1\n\
  8111.    lsls r0, 2\n\
  8112.    add r0, r8\n\
  8113.    ldrb r0, [r0, 0x2]\n\
  8114.    strh r0, [r2]\n\
  8115.    b _08022244\n\
  8116.    .align 2, 0\n\
  8117. _08022044: .4byte gLastHitByType\n\
  8118. _08022048: .4byte gBankTarget\n\
  8119. _0802204C:\n\
  8120.    ldr r0, _0802205C @ =gLastLandedMoves\n\
  8121.    ldr r2, _08022060 @ =gBankTarget\n\
  8122.    ldrb r1, [r2]\n\
  8123.    lsls r1, 1\n\
  8124.    adds r1, r0\n\
  8125.    ldr r0, _08022064 @ =0x0000ffff\n\
  8126.    b _08021C22\n\
  8127.    .align 2, 0\n\
  8128. _0802205C: .4byte gLastLandedMoves\n\
  8129. _08022060: .4byte gBankTarget\n\
  8130. _08022064: .4byte 0x0000ffff\n\
  8131. _08022068:\n\
  8132.    ldr r0, _0802212C @ =gAbsentBattlerFlags\n\
  8133.    ldrb r1, [r0]\n\
  8134.    ldr r6, _08022130 @ =gBitTable\n\
  8135.    ldr r2, _08022134 @ =gBankAttacker\n\
  8136.    ldrb r5, [r2]\n\
  8137.    lsls r0, r5, 2\n\
  8138.    adds r0, r6\n\
  8139.    ldr r4, [r0]\n\
  8140.    ands r1, r4\n\
  8141.    mov r9, r2\n\
  8142.    cmp r1, 0\n\
  8143.    beq _08022082\n\
  8144.    b _08022244\n\
  8145. _08022082:\n\
  8146.    ldr r0, _08022138 @ =0x000160a6\n\
  8147.    add r0, r12\n\
  8148.    ldrb r0, [r0]\n\
  8149.    ands r0, r4\n\
  8150.    cmp r0, 0\n\
  8151.    beq _08022090\n\
  8152.    b _08022244\n\
  8153. _08022090:\n\
  8154.    ldr r1, _0802213C @ =gBattleMoves\n\
  8155.    ldr r4, _08022140 @ =gChosenMove\n\
  8156.    ldrh r3, [r4]\n\
  8157.    lsls r0, r3, 1\n\
  8158.    adds r0, r3\n\
  8159.    lsls r0, 2\n\
  8160.    adds r0, r1\n\
  8161.    ldrb r1, [r0, 0x8]\n\
  8162.    movs r0, 0x10\n\
  8163.    ands r0, r1\n\
  8164.    cmp r0, 0\n\
  8165.    beq _0802215C\n\
  8166.    ldr r0, _08022144 @ =gHitMarker\n\
  8167.    ldr r1, [r0]\n\
  8168.    movs r0, 0x80\n\
  8169.    lsls r0, 18\n\
  8170.    ands r0, r1\n\
  8171.    cmp r0, 0\n\
  8172.    beq _0802215C\n\
  8173.    ldr r2, _08022148 @ =gBankTarget\n\
  8174.    ldrb r0, [r2]\n\
  8175.    cmp r5, r0\n\
  8176.    bne _080220C0\n\
  8177.    b _08022244\n\
  8178. _080220C0:\n\
  8179.    adds r2, r0, 0\n\
  8180.    lsls r0, r2, 2\n\
  8181.    adds r0, r6\n\
  8182.    ldr r0, [r0]\n\
  8183.    lsls r0, 28\n\
  8184.    ands r1, r0\n\
  8185.    cmp r1, 0\n\
  8186.    bne _0802215C\n\
  8187.    ldr r0, _0802214C @ =gMoveResultFlags\n\
  8188.    ldrb r1, [r0]\n\
  8189.    movs r0, 0x29\n\
  8190.    ands r0, r1\n\
  8191.    cmp r0, 0\n\
  8192.    bne _0802215C\n\
  8193.    lsls r0, r2, 1\n\
  8194.    ldr r5, _08022150 @ =0x000160ac\n\
  8195.    adds r0, r5\n\
  8196.    add r0, r12\n\
  8197.    strb r3, [r0]\n\
  8198.    ldr r0, _08022148 @ =gBankTarget\n\
  8199.    ldrb r1, [r0]\n\
  8200.    lsls r1, 1\n\
  8201.    ldr r2, _08022154 @ =0x000160ad\n\
  8202.    adds r1, r2\n\
  8203.    add r1, r12\n\
  8204.    ldrh r0, [r4]\n\
  8205.    lsrs r0, 8\n\
  8206.    strb r0, [r1]\n\
  8207.    ldr r3, _08022148 @ =gBankTarget\n\
  8208.    ldrb r2, [r3]\n\
  8209.    lsls r2, 2\n\
  8210.    mov r5, r9\n\
  8211.    ldrb r0, [r5]\n\
  8212.    lsrs r0, 1\n\
  8213.    lsls r0, 1\n\
  8214.    ldr r1, _08022158 @ =0x00016100\n\
  8215.    adds r0, r1\n\
  8216.    adds r2, r0\n\
  8217.    add r2, r12\n\
  8218.    ldrh r0, [r4]\n\
  8219.    strb r0, [r2]\n\
  8220.    ldrb r2, [r3]\n\
  8221.    lsls r2, 2\n\
  8222.    ldrb r0, [r5]\n\
  8223.    lsrs r0, 1\n\
  8224.    lsls r0, 1\n\
  8225.    adds r1, 0x1\n\
  8226.    adds r0, r1\n\
  8227.    adds r2, r0\n\
  8228.    add r2, r12\n\
  8229.    ldrh r0, [r4]\n\
  8230.    lsrs r0, 8\n\
  8231.    strb r0, [r2]\n\
  8232.    b _08022244\n\
  8233.    .align 2, 0\n\
  8234. _0802212C: .4byte gAbsentBattlerFlags\n\
  8235. _08022130: .4byte gBitTable\n\
  8236. _08022134: .4byte gBankAttacker\n\
  8237. _08022138: .4byte 0x000160a6\n\
  8238. _0802213C: .4byte gBattleMoves\n\
  8239. _08022140: .4byte gChosenMove\n\
  8240. _08022144: .4byte gHitMarker\n\
  8241. _08022148: .4byte gBankTarget\n\
  8242. _0802214C: .4byte gMoveResultFlags\n\
  8243. _08022150: .4byte 0x000160ac\n\
  8244. _08022154: .4byte 0x000160ad\n\
  8245. _08022158: .4byte 0x00016100\n\
  8246. _0802215C:\n\
  8247.    mov r1, r9\n\
  8248.    ldrb r0, [r1]\n\
  8249.    ldr r2, _080221B4 @ =gBankTarget\n\
  8250.    ldrb r2, [r2]\n\
  8251.    cmp r0, r2\n\
  8252.    beq _08022244\n\
  8253.    ldr r3, _080221B4 @ =gBankTarget\n\
  8254.    ldrb r0, [r3]\n\
  8255.    lsls r0, 1\n\
  8256.    ldr r4, _080221B8 @ =0x000160ac\n\
  8257.    adds r0, r4\n\
  8258.    add r0, r12\n\
  8259.    movs r3, 0\n\
  8260.    strb r3, [r0]\n\
  8261.    ldr r5, _080221B4 @ =gBankTarget\n\
  8262.    ldrb r0, [r5]\n\
  8263.    lsls r0, 1\n\
  8264.    ldr r1, _080221BC @ =0x000160ad\n\
  8265.    adds r0, r1\n\
  8266.    add r0, r12\n\
  8267.    strb r3, [r0]\n\
  8268.    ldrb r2, [r5]\n\
  8269.    lsls r2, 2\n\
  8270.    mov r4, r9\n\
  8271.    ldrb r0, [r4]\n\
  8272.    lsrs r0, 1\n\
  8273.    lsls r0, 1\n\
  8274.    adds r1, 0x53\n\
  8275.    adds r0, r1\n\
  8276.    adds r2, r0\n\
  8277.    add r2, r12\n\
  8278.    strb r3, [r2]\n\
  8279.    ldrb r2, [r5]\n\
  8280.    lsls r2, 2\n\
  8281.    ldrb r0, [r4]\n\
  8282.    lsrs r0, 1\n\
  8283.    lsls r0, 1\n\
  8284.    adds r1, 0x1\n\
  8285.    adds r0, r1\n\
  8286.    adds r2, r0\n\
  8287.    add r2, r12\n\
  8288.    strb r3, [r2]\n\
  8289.    b _08022244\n\
  8290.    .align 2, 0\n\
  8291. _080221B4: .4byte gBankTarget\n\
  8292. _080221B8: .4byte 0x000160ac\n\
  8293. _080221BC: .4byte 0x000160ad\n\
  8294. _080221C0:\n\
  8295.    ldr r5, _080222B0 @ =gHitMarker\n\
  8296.    ldr r2, [r5]\n\
  8297.    movs r0, 0x80\n\
  8298.    lsls r0, 12\n\
  8299.    ands r0, r2\n\
  8300.    cmp r0, 0\n\
  8301.    bne _08022244\n\
  8302.    ldr r0, _080222B4 @ =gBattleTypeFlags\n\
  8303.    ldrh r1, [r0]\n\
  8304.    movs r0, 0x1\n\
  8305.    ands r0, r1\n\
  8306.    cmp r0, 0\n\
  8307.    beq _08022244\n\
  8308.    ldr r1, _080222B8 @ =gProtectStructs\n\
  8309.    ldr r0, _080222BC @ =gBankAttacker\n\
  8310.    ldrb r0, [r0]\n\
  8311.    lsls r0, 4\n\
  8312.    adds r0, r1\n\
  8313.    ldrb r0, [r0, 0x1]\n\
  8314.    lsls r0, 29\n\
  8315.    cmp r0, 0\n\
  8316.    blt _08022244\n\
  8317.    ldr r0, _080222C0 @ =gBattleMoves\n\
  8318.    mov r9, r0\n\
  8319.    ldr r1, _080222C4 @ =gCurrentMove\n\
  8320.    mov r8, r1\n\
  8321.    ldrh r0, [r1]\n\
  8322.    lsls r1, r0, 1\n\
  8323.    adds r1, r0\n\
  8324.    lsls r1, 2\n\
  8325.    add r1, r9\n\
  8326.    ldrb r0, [r1, 0x6]\n\
  8327.    cmp r0, 0x8\n\
  8328.    bne _08022244\n\
  8329.    movs r6, 0x80\n\
  8330.    lsls r6, 2\n\
  8331.    adds r4, r6, 0\n\
  8332.    ands r4, r2\n\
  8333.    cmp r4, 0\n\
  8334.    bne _08022244\n\
  8335.    ldr r7, _080222C8 @ =gBankTarget\n\
  8336.    ldrb r0, [r7]\n\
  8337.    bl GetBattlerPosition\n\
  8338.    movs r1, 0x2\n\
  8339.    eors r0, r1\n\
  8340.    lsls r0, 24\n\
  8341.    lsrs r0, 24\n\
  8342.    bl GetBattlerAtPosition\n\
  8343.    lsls r0, 24\n\
  8344.    lsrs r2, r0, 24\n\
  8345.    ldr r1, _080222CC @ =gBattleMons\n\
  8346.    movs r0, 0x58\n\
  8347.    muls r0, r2\n\
  8348.    adds r0, r1\n\
  8349.    ldrh r0, [r0, 0x28]\n\
  8350.    cmp r0, 0\n\
  8351.    beq _0802223A\n\
  8352.    bl _08021874\n\
  8353. _0802223A:\n\
  8354.    ldr r0, [r5]\n\
  8355.    orrs r0, r6\n\
  8356.    str r0, [r5]\n\
  8357.    ldr r2, _080222D0 @ =gSharedMem\n\
  8358.    mov r12, r2\n\
  8359. _08022244:\n\
  8360.    ldr r1, _080222D4 @ =0x0001600c\n\
  8361.    add r1, r12\n\
  8362.    ldrb r0, [r1]\n\
  8363.    adds r0, 0x1\n\
  8364.    strb r0, [r1]\n\
  8365. _0802224E:\n\
  8366.    ldr r3, [sp, 0x10]\n\
  8367.    cmp r3, 0x1\n\
  8368.    bne _08022262\n\
  8369.    mov r4, r10\n\
  8370.    cmp r4, 0\n\
  8371.    bne _08022262\n\
  8372.    ldr r1, _080222D4 @ =0x0001600c\n\
  8373.    add r1, r12\n\
  8374.    movs r0, 0x11\n\
  8375.    strb r0, [r1]\n\
  8376. _08022262:\n\
  8377.    ldr r5, [sp, 0x10]\n\
  8378.    cmp r5, 0x2\n\
  8379.    bne _08022278\n\
  8380.    ldr r1, _080222D4 @ =0x0001600c\n\
  8381.    add r1, r12\n\
  8382.    ldr r0, [sp, 0x14]\n\
  8383.    ldrb r2, [r1]\n\
  8384.    cmp r0, r2\n\
  8385.    bne _08022278\n\
  8386.    movs r0, 0x11\n\
  8387.    strb r0, [r1]\n\
  8388. _08022278:\n\
  8389.    ldr r0, _080222D4 @ =0x0001600c\n\
  8390.    add r0, r12\n\
  8391.    ldrb r0, [r0]\n\
  8392.    cmp r0, 0x11\n\
  8393.    beq _08022286\n\
  8394.    bl _080218E4\n\
  8395. _08022286:\n\
  8396.    ldr r0, _080222D4 @ =0x0001600c\n\
  8397.    add r0, r12\n\
  8398.    ldrb r0, [r0]\n\
  8399.    cmp r0, 0x11\n\
  8400.    bne _0802229E\n\
  8401.    mov r3, r10\n\
  8402.    cmp r3, 0\n\
  8403.    bne _0802229E\n\
  8404.    ldr r1, _080222D8 @ =gBattlescriptCurrInstr\n\
  8405.    ldr r0, [r1]\n\
  8406.    adds r0, 0x3\n\
  8407. _0802229C:\n\
  8408.    str r0, [r1]\n\
  8409. _0802229E:\n\
  8410.    add sp, 0x18\n\
  8411.    pop {r3-r5}\n\
  8412.    mov r8, r3\n\
  8413.    mov r9, r4\n\
  8414.    mov r10, r5\n\
  8415.    pop {r4-r7}\n\
  8416.    pop {r0}\n\
  8417.    bx r0\n\
  8418.    .align 2, 0\n\
  8419. _080222B0: .4byte gHitMarker\n\
  8420. _080222B4: .4byte gBattleTypeFlags\n\
  8421. _080222B8: .4byte gProtectStructs\n\
  8422. _080222BC: .4byte gBankAttacker\n\
  8423. _080222C0: .4byte gBattleMoves\n\
  8424. _080222C4: .4byte gCurrentMove\n\
  8425. _080222C8: .4byte gBankTarget\n\
  8426. _080222CC: .4byte gBattleMons\n\
  8427. _080222D0: .4byte gSharedMem\n\
  8428. _080222D4: .4byte 0x0001600c\n\
  8429. _080222D8: .4byte gBattlescriptCurrInstr\n\
  8430.        .syntax divided"
  8431.                 );
  8432. }
  8433. #endif // NONMATCHING
  8434.  
  8435. static void atk4A_typecalc2(void)
  8436. {
  8437.     u8 flags = 0;
  8438.     int i = 0;
  8439.     u8 move_type = gBattleMoves[gCurrentMove].type;
  8440.  
  8441.     if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND)
  8442.     {
  8443.         gLastUsedAbility = gBattleMons[gBankTarget].ability;
  8444.         gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);
  8445.         gLastLandedMoves[gBankTarget] = 0;
  8446.         gBattleCommunication[6] = move_type;
  8447.         RecordAbilityBattle(gBankTarget, gLastUsedAbility);
  8448.     }
  8449.     else
  8450.     {
  8451.         while (gTypeEffectiveness[i]!= TYPE_ENDTABLE)
  8452.         {
  8453.             if (gTypeEffectiveness[i] == TYPE_FORESIGHT)
  8454.             {
  8455.                 if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) {break;}
  8456.                 else {i += 3; continue;}
  8457.             }
  8458.  
  8459.             if (gTypeEffectiveness[i] == move_type)
  8460.             {
  8461.                 //check type1
  8462.                 if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1)
  8463.                 {
  8464.                     if (gTypeEffectiveness[i + 2] == 0)
  8465.                     {
  8466.                         gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
  8467.                         break;
  8468.                     }
  8469.                     if (gTypeEffectiveness[i + 2] == 5)
  8470.                         flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
  8471.                     if (gTypeEffectiveness[i + 2] == 20)
  8472.                         flags |= MOVE_RESULT_SUPER_EFFECTIVE;
  8473.                 }
  8474.                 //check type2
  8475.                 if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2)
  8476.                 {
  8477.                     if (gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2
  8478.                         && gTypeEffectiveness[i + 2] == 0)
  8479.                     {
  8480.                         gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
  8481.                         break;
  8482.                     }
  8483.                     if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 5)
  8484.                         flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
  8485.                     if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2
  8486.                         && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 20)
  8487.                             flags |= MOVE_RESULT_SUPER_EFFECTIVE;
  8488.                 }
  8489.             }
  8490.             i += 3;
  8491.         }
  8492.     }
  8493.  
  8494.     if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_NO_EFFECT) && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 &&
  8495.         (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) &&
  8496.         gBattleMoves[gCurrentMove].power)
  8497.     {
  8498.         gLastUsedAbility = ABILITY_WONDER_GUARD;
  8499.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  8500.         gLastLandedMoves[gBankTarget] = 0;
  8501.         gBattleCommunication[6] = 3;
  8502.         RecordAbilityBattle(gBankTarget, gLastUsedAbility);
  8503.     }
  8504.     if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
  8505.         gProtectStructs[gBankAttacker].notEffective = 1;
  8506.  
  8507.     gBattlescriptCurrInstr++;
  8508. }
  8509.  
  8510. static void atk4B_returnatktoball(void)
  8511. {
  8512.     gActiveBattler = gBankAttacker;
  8513.     if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler)))
  8514.     {
  8515.         EmitReturnPokeToBall(0, 0);
  8516.         MarkBufferBankForExecution(gActiveBattler);
  8517.     }
  8518.     gBattlescriptCurrInstr++;
  8519. }
  8520.  
  8521. static void atk4C_getswitchedmondata(void)
  8522. {
  8523.     if (gBattleExecBuffer)
  8524.         return;
  8525.  
  8526.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  8527.  
  8528.     gBattlerPartyIndexes[gActiveBattler] = ewram16068arr(gActiveBattler);
  8529.  
  8530.     EmitGetAttributes(0, 0, gBitTable[gBattlerPartyIndexes[gActiveBattler]]);
  8531.     MarkBufferBankForExecution(gActiveBattler);
  8532.     gBattlescriptCurrInstr += 2;
  8533. }
  8534.  
  8535. static void atk4D_switchindataupdate(void)
  8536. {
  8537.     struct BattlePokemon oldData;
  8538.     s32 i;
  8539.     u8 *monData;
  8540.  
  8541.     if (gBattleExecBuffer)
  8542.         return;
  8543.  
  8544.     gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]);
  8545.     oldData = gBattleMons[gActiveBattler];
  8546.     monData = (u8*)(&gBattleMons[gActiveBattler]);
  8547.  
  8548.     for (i = 0; i < sizeof(struct BattlePokemon); i++)
  8549.     {
  8550.         monData[i] = gBattleBufferB[gActiveBattler][4 + i];
  8551.     }
  8552.  
  8553.     gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1;
  8554.     gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2;
  8555.     gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].altAbility);
  8556.  
  8557.     // check knocked off item
  8558.     i = GetBattlerSide(gActiveBattler);
  8559.     if (gWishFutureKnock.knockedOffPokes[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]])
  8560.     {
  8561.         gBattleMons[gActiveBattler].item = 0;
  8562.     }
  8563.  
  8564.     if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)
  8565.     {
  8566.         for (i = 0; i < 8; i++)
  8567.         {
  8568.             gBattleMons[gActiveBattler].statStages[i] = oldData.statStages[i];
  8569.         }
  8570.         gBattleMons[gActiveBattler].status2 = oldData.status2;
  8571.     }
  8572.  
  8573.     SwitchInClearSetData();
  8574.  
  8575.     gBattleStruct->scriptingActive = gActiveBattler;
  8576.  
  8577.     PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]);
  8578.  
  8579.     gBattlescriptCurrInstr += 2;
  8580. }
  8581.  
  8582. static void atk4E_switchinanim(void)
  8583. {
  8584.     if (gBattleExecBuffer)
  8585.         return;
  8586.  
  8587.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  8588.     if (GetBattlerSide(gActiveBattler) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER)))
  8589.     {
  8590.         GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), 2);
  8591.     }
  8592.     gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]);
  8593.     EmitSendOutPoke(0, gBattlerPartyIndexes[gActiveBattler], T2_READ_8(gBattlescriptCurrInstr + 2));
  8594.     MarkBufferBankForExecution(gActiveBattler);
  8595.     gBattlescriptCurrInstr += 3;
  8596. }
  8597.  
  8598. static void atk4F_jumpifcantswitch(void)
  8599. {
  8600.     int val, to_cmp;
  8601.     register struct Pokemon *party;
  8602.     u8 r7;
  8603.     //0x80 byte is used as a way of telling the function whether to not check status2/status3
  8604.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1) & 0x7F);
  8605.     if (!(T2_READ_8(gBattlescriptCurrInstr + 1) & 0x80)
  8606.         && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
  8607.             || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)))
  8608.     {
  8609.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  8610.         return;
  8611.     }
  8612.     if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
  8613.     {
  8614.         if (GetBattlerSide(gActiveBattler) == 1)
  8615.             party = gEnemyParty;
  8616.         else
  8617.             party = gPlayerParty;
  8618.         val = 0;
  8619.         if (sub_803FBFC(sub_803FC34(gActiveBattler)) == 1)
  8620.             val = 3;
  8621.         for (to_cmp = val + 3; val < to_cmp; val++)
  8622.         {
  8623.             if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
  8624.              && !GetMonData(&party[val], MON_DATA_IS_EGG)
  8625.              && GetMonData(&party[val], MON_DATA_HP) != 0
  8626.              && gBattlerPartyIndexes[gActiveBattler] != val)
  8627.                 break;
  8628.         }
  8629.         if (val == to_cmp)
  8630.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  8631.         else
  8632.             gBattlescriptCurrInstr += 6;
  8633.     }
  8634.     else
  8635.     {
  8636.         if (GetBattlerSide(gActiveBattler) == 1)
  8637.         {
  8638.             r7 = GetBattlerAtPosition(1);
  8639.             if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  8640.                 to_cmp = GetBattlerAtPosition(3);
  8641.             else
  8642.                 to_cmp = r7;
  8643.             party = gEnemyParty;
  8644.         }
  8645.         else
  8646.         {
  8647.             r7 = GetBattlerAtPosition(0);
  8648.             if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  8649.                 to_cmp = GetBattlerAtPosition(2);
  8650.             else
  8651.                 to_cmp = r7;
  8652.             party = gPlayerParty;
  8653.         }
  8654.         for (val = 0; val < 6; val++)
  8655.         {
  8656.             if (GetMonData(&party[val], MON_DATA_HP) != 0
  8657.              && GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
  8658.              && !GetMonData(&party[val], MON_DATA_IS_EGG)
  8659.              && val != gBattlerPartyIndexes[r7] && val != gBattlerPartyIndexes[to_cmp])
  8660.                 break;
  8661.         }
  8662.         if (val == 6)
  8663.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  8664.         else
  8665.             gBattlescriptCurrInstr += 6;
  8666.     }
  8667. }
  8668.  
  8669. void sub_8022A3C(u8 unkown)
  8670. {
  8671.     BATTLE_PARTY_ID(gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];
  8672.     EmitChoosePokemon(0, 1, unkown, 0, gBattleStruct->unk1606C[gActiveBattler]);
  8673.     MarkBufferBankForExecution(gActiveBattler);
  8674. }
  8675.  
  8676. /*
  8677. static void atk50_openpartyscreen(void)
  8678. {
  8679.     int i = 0;
  8680.     int r9 = 0;
  8681.     u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  8682.  
  8683.     if (T2_READ_8(gBattlescriptCurrInstr + 1) == 5)
  8684.     {
  8685.         if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE)
  8686.         {
  8687.             for (gActiveBattler = i; gActiveBattler < gBattlersCount; gActiveBattler++)
  8688.             {
  8689.                 if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler)))
  8690.                 {
  8691.                     EmitLinkStandbyMsg(0, 2);
  8692.                     MarkBufferBankForExecution(gActiveBattler);
  8693.                 }
  8694.                 else if (sub_8018018(gActiveBattler, 6, 6) == 0
  8695.                          && !gSpecialStatuses[gActiveBattler].flag40)
  8696.                 {
  8697.                     sub_8022A3C(6);
  8698.                     gSpecialStatuses[gActiveBattler].flag40 = 1;
  8699.                 }
  8700.                 else
  8701.                 {
  8702.                     gAbsentBattlerFlags |= gBitTable[gActiveBattler];
  8703.                     gHitMarker &= (~HITMARKER_FAINTED(gActiveBattler));
  8704.                     EmitLinkStandbyMsg(0, 2);
  8705.                     MarkBufferBankForExecution(gActiveBattler);
  8706.                 }
  8707.             }
  8708.         }
  8709.         else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  8710.         {
  8711.             if (!(gHitMarker >> 0x1C & gBitTable[0]))
  8712.             {
  8713.  
  8714.             }
  8715.             else if (sub_8018018(gActiveBattler, 6, 6) == 0
  8716.                      && !gSpecialStatuses[gActiveBattler].flag40)
  8717.             {
  8718.  
  8719.             }
  8720.             else
  8721.             {
  8722.  
  8723.             }
  8724.         }
  8725.     }
  8726. }
  8727. */
  8728.  
  8729. NAKED
  8730. static void atk50_openpartyscreen(void)
  8731. {
  8732.     asm(".syntax unified\n\
  8733.    push {r4-r7,lr}\n\
  8734.    mov r7, r9\n\
  8735.    mov r6, r8\n\
  8736.    push {r6,r7}\n\
  8737.    sub sp, 0x4\n\
  8738.    movs r7, 0\n\
  8739.    movs r0, 0\n\
  8740.    mov r9, r0\n\
  8741.    ldr r6, _08022B44 @ =gBattlescriptCurrInstr\n\
  8742.    ldr r1, [r6]\n\
  8743.    ldrb r2, [r1, 0x2]\n\
  8744.    ldrb r0, [r1, 0x3]\n\
  8745.    lsls r0, 8\n\
  8746.    orrs r2, r0\n\
  8747.    ldrb r0, [r1, 0x4]\n\
  8748.    lsls r0, 16\n\
  8749.    orrs r2, r0\n\
  8750.    ldrb r0, [r1, 0x5]\n\
  8751.    lsls r0, 24\n\
  8752.    orrs r2, r0\n\
  8753.    mov r8, r2\n\
  8754.    ldrb r2, [r1, 0x1]\n\
  8755.    adds r0, r2, 0\n\
  8756.    mov r12, r6\n\
  8757.    cmp r0, 0x5\n\
  8758.    beq _08022ACE\n\
  8759.    b _08022F74\n\
  8760. _08022ACE:\n\
  8761.    ldr r0, _08022B48 @ =gBattleTypeFlags\n\
  8762.    ldrh r0, [r0]\n\
  8763.    movs r1, 0x41\n\
  8764.    ands r1, r0\n\
  8765.    cmp r1, 0x1\n\
  8766.    beq _08022BBC\n\
  8767.    ldr r1, _08022B4C @ =gActiveBattler\n\
  8768.    strb r7, [r1]\n\
  8769.    ldr r0, _08022B50 @ =gBattlersCount\n\
  8770.    ldrb r0, [r0]\n\
  8771.    cmp r7, r0\n\
  8772.    bcc _08022AE8\n\
  8773.    b _08022F62\n\
  8774. _08022AE8:\n\
  8775.    ldr r7, _08022B54 @ =gHitMarker\n\
  8776.    ldr r6, _08022B58 @ =gBitTable\n\
  8777.    adds r4, r1, 0\n\
  8778.    ldr r0, _08022B5C @ =gAbsentBattlerFlags\n\
  8779.    mov r8, r0\n\
  8780. _08022AF2:\n\
  8781.    ldrb r2, [r4]\n\
  8782.    lsls r0, r2, 2\n\
  8783.    adds r0, r6\n\
  8784.    ldr r1, [r0]\n\
  8785.    lsls r1, 28\n\
  8786.    ldr r0, [r7]\n\
  8787.    ands r0, r1\n\
  8788.    cmp r0, 0\n\
  8789.    beq _08022B94\n\
  8790.    adds r0, r2, 0\n\
  8791.    movs r1, 0x6\n\
  8792.    movs r2, 0x6\n\
  8793.    bl sub_8018018\n\
  8794.    lsls r0, 24\n\
  8795.    cmp r0, 0\n\
  8796.    beq _08022B60\n\
  8797.    ldrb r0, [r4]\n\
  8798.    lsls r0, 2\n\
  8799.    adds r0, r6\n\
  8800.    ldr r0, [r0]\n\
  8801.    mov r2, r8\n\
  8802.    ldrb r1, [r2]\n\
  8803.    orrs r0, r1\n\
  8804.    strb r0, [r2]\n\
  8805.    ldrb r0, [r4]\n\
  8806.    lsls r0, 2\n\
  8807.    adds r0, r6\n\
  8808.    ldr r1, [r0]\n\
  8809.    lsls r1, 28\n\
  8810.    ldr r0, [r7]\n\
  8811.    bics r0, r1\n\
  8812.    str r0, [r7]\n\
  8813.    movs r0, 0\n\
  8814.    movs r1, 0x2\n\
  8815.    bl EmitLinkStandbyMsg\n\
  8816.    ldrb r0, [r4]\n\
  8817.    bl MarkBufferBankForExecution\n\
  8818.    b _08022BA2\n\
  8819.    .align 2, 0\n\
  8820. _08022B44: .4byte gBattlescriptCurrInstr\n\
  8821. _08022B48: .4byte gBattleTypeFlags\n\
  8822. _08022B4C: .4byte gActiveBattler\n\
  8823. _08022B50: .4byte gBattlersCount\n\
  8824. _08022B54: .4byte gHitMarker\n\
  8825. _08022B58: .4byte gBitTable\n\
  8826. _08022B5C: .4byte gAbsentBattlerFlags\n\
  8827. _08022B60:\n\
  8828.    ldr r5, _08022B90 @ =gSpecialStatuses\n\
  8829.    ldrb r0, [r4]\n\
  8830.    lsls r1, r0, 2\n\
  8831.    adds r1, r0\n\
  8832.    lsls r1, 2\n\
  8833.    adds r1, r5\n\
  8834.    ldrb r0, [r1]\n\
  8835.    lsls r0, 25\n\
  8836.    cmp r0, 0\n\
  8837.    blt _08022BA2\n\
  8838.    movs r0, 0x6\n\
  8839.    bl sub_8022A3C\n\
  8840.    ldrb r1, [r4]\n\
  8841.    lsls r0, r1, 2\n\
  8842.    adds r0, r1\n\
  8843.    lsls r0, 2\n\
  8844.    adds r0, r5\n\
  8845.    ldrb r1, [r0]\n\
  8846.    movs r2, 0x40\n\
  8847.    orrs r1, r2\n\
  8848.    strb r1, [r0]\n\
  8849.    b _08022BA2\n\
  8850.    .align 2, 0\n\
  8851. _08022B90: .4byte gSpecialStatuses\n\
  8852. _08022B94:\n\
  8853.    movs r0, 0\n\
  8854.    movs r1, 0x2\n\
  8855.    bl EmitLinkStandbyMsg\n\
  8856.    ldrb r0, [r4]\n\
  8857.    bl MarkBufferBankForExecution\n\
  8858. _08022BA2:\n\
  8859.    ldrb r0, [r4]\n\
  8860.    adds r0, 0x1\n\
  8861.    strb r0, [r4]\n\
  8862.    ldr r1, _08022BB8 @ =gBattlersCount\n\
  8863.    lsls r0, 24\n\
  8864.    lsrs r0, 24\n\
  8865.    ldrb r1, [r1]\n\
  8866.    cmp r0, r1\n\
  8867.    bcc _08022AF2\n\
  8868.    b _08022F62\n\
  8869.    .align 2, 0\n\
  8870. _08022BB8: .4byte gBattlersCount\n\
  8871. _08022BBC:\n\
  8872.    ands r1, r0\n\
  8873.    cmp r1, 0\n\
  8874.    bne _08022BC4\n\
  8875.    b _08022F62\n\
  8876. _08022BC4:\n\
  8877.    ldr r0, _08022C1C @ =gHitMarker\n\
  8878.    mov r8, r0\n\
  8879.    ldr r0, [r0]\n\
  8880.    lsrs r5, r0, 28\n\
  8881.    ldr r6, _08022C20 @ =gBitTable\n\
  8882.    ldr r0, [r6]\n\
  8883.    ands r0, r5\n\
  8884.    cmp r0, 0\n\
  8885.    beq _08022C7E\n\
  8886.    ldr r4, _08022C24 @ =gActiveBattler\n\
  8887.    strb r7, [r4]\n\
  8888.    movs r0, 0\n\
  8889.    movs r1, 0x6\n\
  8890.    movs r2, 0x6\n\
  8891.    bl sub_8018018\n\
  8892.    lsls r0, 24\n\
  8893.    cmp r0, 0\n\
  8894.    beq _08022C2C\n\
  8895.    ldr r2, _08022C28 @ =gAbsentBattlerFlags\n\
  8896.    ldrb r0, [r4]\n\
  8897.    lsls r0, 2\n\
  8898.    adds r0, r6\n\
  8899.    ldr r0, [r0]\n\
  8900.    ldrb r1, [r2]\n\
  8901.    orrs r0, r1\n\
  8902.    strb r0, [r2]\n\
  8903.    ldrb r0, [r4]\n\
  8904.    lsls r0, 2\n\
  8905.    adds r0, r6\n\
  8906.    ldr r1, [r0]\n\
  8907.    lsls r1, 28\n\
  8908.    mov r2, r8\n\
  8909.    ldr r0, [r2]\n\
  8910.    bics r0, r1\n\
  8911.    str r0, [r2]\n\
  8912.    movs r0, 0\n\
  8913.    bl Emitcmd42\n\
  8914.    ldrb r0, [r4]\n\
  8915.    bl MarkBufferBankForExecution\n\
  8916.    b _08022C7E\n\
  8917.    .align 2, 0\n\
  8918. _08022C1C: .4byte gHitMarker\n\
  8919. _08022C20: .4byte gBitTable\n\
  8920. _08022C24: .4byte gActiveBattler\n\
  8921. _08022C28: .4byte gAbsentBattlerFlags\n\
  8922. _08022C2C:\n\
  8923.    ldr r6, _08022C60 @ =gSpecialStatuses\n\
  8924.    ldrb r0, [r4]\n\
  8925.    lsls r1, r0, 2\n\
  8926.    adds r1, r0\n\
  8927.    lsls r1, 2\n\
  8928.    adds r1, r6\n\
  8929.    ldrb r0, [r1]\n\
  8930.    lsls r0, 25\n\
  8931.    cmp r0, 0\n\
  8932.    blt _08022C6C\n\
  8933.    ldr r0, _08022C64 @ =gSharedMem\n\
  8934.    ldr r1, _08022C68 @ =0x0001606a\n\
  8935.    adds r0, r1\n\
  8936.    ldrb r0, [r0]\n\
  8937.    bl sub_8022A3C\n\
  8938.    ldrb r1, [r4]\n\
  8939.    lsls r0, r1, 2\n\
  8940.    adds r0, r1\n\
  8941.    lsls r0, 2\n\
  8942.    adds r0, r6\n\
  8943.    ldrb r1, [r0]\n\
  8944.    movs r2, 0x40\n\
  8945.    orrs r1, r2\n\
  8946.    strb r1, [r0]\n\
  8947.    b _08022C7E\n\
  8948.    .align 2, 0\n\
  8949. _08022C60: .4byte gSpecialStatuses\n\
  8950. _08022C64: .4byte gSharedMem\n\
  8951. _08022C68: .4byte 0x0001606a\n\
  8952. _08022C6C:\n\
  8953.    movs r0, 0\n\
  8954.    movs r1, 0x2\n\
  8955.    bl EmitLinkStandbyMsg\n\
  8956.    ldrb r0, [r4]\n\
  8957.    bl MarkBufferBankForExecution\n\
  8958.    movs r2, 0x1\n\
  8959.    mov r9, r2\n\
  8960. _08022C7E:\n\
  8961.    ldr r6, _08022CD8 @ =gBitTable\n\
  8962.    ldr r0, [r6, 0x8]\n\
  8963.    ands r0, r5\n\
  8964.    cmp r0, 0\n\
  8965.    beq _08022D40\n\
  8966.    ldr r0, [r6]\n\
  8967.    ands r0, r5\n\
  8968.    cmp r0, 0\n\
  8969.    bne _08022D40\n\
  8970.    ldr r4, _08022CDC @ =gActiveBattler\n\
  8971.    movs r0, 0x2\n\
  8972.    strb r0, [r4]\n\
  8973.    movs r0, 0x2\n\
  8974.    movs r1, 0x6\n\
  8975.    movs r2, 0x6\n\
  8976.    bl sub_8018018\n\
  8977.    lsls r0, 24\n\
  8978.    cmp r0, 0\n\
  8979.    beq _08022CE8\n\
  8980.    ldr r2, _08022CE0 @ =gAbsentBattlerFlags\n\
  8981.    ldrb r0, [r4]\n\
  8982.    lsls r0, 2\n\
  8983.    adds r0, r6\n\
  8984.    ldr r0, [r0]\n\
  8985.    ldrb r1, [r2]\n\
  8986.    orrs r0, r1\n\
  8987.    strb r0, [r2]\n\
  8988.    ldr r2, _08022CE4 @ =gHitMarker\n\
  8989.    ldrb r0, [r4]\n\
  8990.    lsls r0, 2\n\
  8991.    adds r0, r6\n\
  8992.    ldr r1, [r0]\n\
  8993.    lsls r1, 28\n\
  8994.    ldr r0, [r2]\n\
  8995.    bics r0, r1\n\
  8996.    str r0, [r2]\n\
  8997.    movs r0, 0\n\
  8998.    bl Emitcmd42\n\
  8999.    ldrb r0, [r4]\n\
  9000.    bl MarkBufferBankForExecution\n\
  9001.    b _08022D40\n\
  9002.    .align 2, 0\n\
  9003. _08022CD8: .4byte gBitTable\n\
  9004. _08022CDC: .4byte gActiveBattler\n\
  9005. _08022CE0: .4byte gAbsentBattlerFlags\n\
  9006. _08022CE4: .4byte gHitMarker\n\
  9007. _08022CE8:\n\
  9008.    ldr r6, _08022D1C @ =gSpecialStatuses\n\
  9009.    ldrb r0, [r4]\n\
  9010.    lsls r1, r0, 2\n\
  9011.    adds r1, r0\n\
  9012.    lsls r1, 2\n\
  9013.    adds r1, r6\n\
  9014.    ldrb r0, [r1]\n\
  9015.    lsls r0, 25\n\
  9016.    cmp r0, 0\n\
  9017.    blt _08022D28\n\
  9018.    ldr r0, _08022D20 @ =gSharedMem\n\
  9019.    ldr r1, _08022D24 @ =0x00016068\n\
  9020.    adds r0, r1\n\
  9021.    ldrb r0, [r0]\n\
  9022.    bl sub_8022A3C\n\
  9023.    ldrb r1, [r4]\n\
  9024.    lsls r0, r1, 2\n\
  9025.    adds r0, r1\n\
  9026.    lsls r0, 2\n\
  9027.    adds r0, r6\n\
  9028.    ldrb r1, [r0]\n\
  9029.    movs r2, 0x40\n\
  9030.    orrs r1, r2\n\
  9031.    strb r1, [r0]\n\
  9032.    b _08022D40\n\
  9033.    .align 2, 0\n\
  9034. _08022D1C: .4byte gSpecialStatuses\n\
  9035. _08022D20: .4byte gSharedMem\n\
  9036. _08022D24: .4byte 0x00016068\n\
  9037. _08022D28:\n\
  9038.    movs r0, 0x1\n\
  9039.    mov r2, r9\n\
  9040.    ands r0, r2\n\
  9041.    cmp r0, 0\n\
  9042.    bne _08022D40\n\
  9043.    movs r0, 0\n\
  9044.    movs r1, 0x2\n\
  9045.    bl EmitLinkStandbyMsg\n\
  9046.    ldrb r0, [r4]\n\
  9047.    bl MarkBufferBankForExecution\n\
  9048. _08022D40:\n\
  9049.    ldr r6, _08022D90 @ =gBitTable\n\
  9050.    ldr r0, [r6, 0x4]\n\
  9051.    ands r0, r5\n\
  9052.    cmp r0, 0\n\
  9053.    beq _08022DF6\n\
  9054.    ldr r4, _08022D94 @ =gActiveBattler\n\
  9055.    movs r0, 0x1\n\
  9056.    strb r0, [r4]\n\
  9057.    movs r0, 0x1\n\
  9058.    movs r1, 0x6\n\
  9059.    movs r2, 0x6\n\
  9060.    bl sub_8018018\n\
  9061.    lsls r0, 24\n\
  9062.    cmp r0, 0\n\
  9063.    beq _08022DA0\n\
  9064.    ldr r2, _08022D98 @ =gAbsentBattlerFlags\n\
  9065.    ldrb r0, [r4]\n\
  9066.    lsls r0, 2\n\
  9067.    adds r0, r6\n\
  9068.    ldr r0, [r0]\n\
  9069.    ldrb r1, [r2]\n\
  9070.    orrs r0, r1\n\
  9071.    strb r0, [r2]\n\
  9072.    ldr r2, _08022D9C @ =gHitMarker\n\
  9073.    ldrb r0, [r4]\n\
  9074.    lsls r0, 2\n\
  9075.    adds r0, r6\n\
  9076.    ldr r1, [r0]\n\
  9077.    lsls r1, 28\n\
  9078.    ldr r0, [r2]\n\
  9079.    bics r0, r1\n\
  9080.    str r0, [r2]\n\
  9081.    movs r0, 0\n\
  9082.    bl Emitcmd42\n\
  9083.    ldrb r0, [r4]\n\
  9084.    bl MarkBufferBankForExecution\n\
  9085.    b _08022DF6\n\
  9086.    .align 2, 0\n\
  9087. _08022D90: .4byte gBitTable\n\
  9088. _08022D94: .4byte gActiveBattler\n\
  9089. _08022D98: .4byte gAbsentBattlerFlags\n\
  9090. _08022D9C: .4byte gHitMarker\n\
  9091. _08022DA0:\n\
  9092.    ldr r6, _08022DD4 @ =gSpecialStatuses\n\
  9093.    ldrb r0, [r4]\n\
  9094.    lsls r1, r0, 2\n\
  9095.    adds r1, r0\n\
  9096.    lsls r1, 2\n\
  9097.    adds r1, r6\n\
  9098.    ldrb r0, [r1]\n\
  9099.    lsls r0, 25\n\
  9100.    cmp r0, 0\n\
  9101.    blt _08022DE0\n\
  9102.    ldr r0, _08022DD8 @ =gSharedMem\n\
  9103.    ldr r1, _08022DDC @ =0x0001606b\n\
  9104.    adds r0, r1\n\
  9105.    ldrb r0, [r0]\n\
  9106.    bl sub_8022A3C\n\
  9107.    ldrb r1, [r4]\n\
  9108.    lsls r0, r1, 2\n\
  9109.    adds r0, r1\n\
  9110.    lsls r0, 2\n\
  9111.    adds r0, r6\n\
  9112.    ldrb r1, [r0]\n\
  9113.    movs r2, 0x40\n\
  9114.    orrs r1, r2\n\
  9115.    strb r1, [r0]\n\
  9116.    b _08022DF6\n\
  9117.    .align 2, 0\n\
  9118. _08022DD4: .4byte gSpecialStatuses\n\
  9119. _08022DD8: .4byte gSharedMem\n\
  9120. _08022DDC: .4byte 0x0001606b\n\
  9121. _08022DE0:\n\
  9122.    movs r0, 0\n\
  9123.    movs r1, 0x2\n\
  9124.    bl EmitLinkStandbyMsg\n\
  9125.    ldrb r0, [r4]\n\
  9126.    bl MarkBufferBankForExecution\n\
  9127.    movs r0, 0x2\n\
  9128.    mov r2, r9\n\
  9129.    orrs r2, r0\n\
  9130.    mov r9, r2\n\
  9131. _08022DF6:\n\
  9132.    ldr r6, _08022E50 @ =gBitTable\n\
  9133.    ldr r0, [r6, 0xC]\n\
  9134.    ands r0, r5\n\
  9135.    cmp r0, 0\n\
  9136.    beq _08022EB8\n\
  9137.    ldr r0, [r6, 0x4]\n\
  9138.    ands r0, r5\n\
  9139.    cmp r0, 0\n\
  9140.    bne _08022EB8\n\
  9141.    ldr r4, _08022E54 @ =gActiveBattler\n\
  9142.    movs r0, 0x3\n\
  9143.    strb r0, [r4]\n\
  9144.    movs r0, 0x3\n\
  9145.    movs r1, 0x6\n\
  9146.    movs r2, 0x6\n\
  9147.    bl sub_8018018\n\
  9148.    lsls r0, 24\n\
  9149.    cmp r0, 0\n\
  9150.    beq _08022E60\n\
  9151.    ldr r2, _08022E58 @ =gAbsentBattlerFlags\n\
  9152.    ldrb r0, [r4]\n\
  9153.    lsls r0, 2\n\
  9154.    adds r0, r6\n\
  9155.    ldr r0, [r0]\n\
  9156.    ldrb r1, [r2]\n\
  9157.    orrs r0, r1\n\
  9158.    strb r0, [r2]\n\
  9159.    ldr r2, _08022E5C @ =gHitMarker\n\
  9160.    ldrb r0, [r4]\n\
  9161.    lsls r0, 2\n\
  9162.    adds r0, r6\n\
  9163.    ldr r1, [r0]\n\
  9164.    lsls r1, 28\n\
  9165.    ldr r0, [r2]\n\
  9166.    bics r0, r1\n\
  9167.    str r0, [r2]\n\
  9168.    movs r0, 0\n\
  9169.    bl Emitcmd42\n\
  9170.    ldrb r0, [r4]\n\
  9171.    bl MarkBufferBankForExecution\n\
  9172.    b _08022EB8\n\
  9173.    .align 2, 0\n\
  9174. _08022E50: .4byte gBitTable\n\
  9175. _08022E54: .4byte gActiveBattler\n\
  9176. _08022E58: .4byte gAbsentBattlerFlags\n\
  9177. _08022E5C: .4byte gHitMarker\n\
  9178. _08022E60:\n\
  9179.    ldr r6, _08022E94 @ =gSpecialStatuses\n\
  9180.    ldrb r0, [r4]\n\
  9181.    lsls r1, r0, 2\n\
  9182.    adds r1, r0\n\
  9183.    lsls r1, 2\n\
  9184.    adds r1, r6\n\
  9185.    ldrb r0, [r1]\n\
  9186.    lsls r0, 25\n\
  9187.    cmp r0, 0\n\
  9188.    blt _08022EA0\n\
  9189.    ldr r0, _08022E98 @ =gSharedMem\n\
  9190.    ldr r1, _08022E9C @ =0x00016069\n\
  9191.    adds r0, r1\n\
  9192.    ldrb r0, [r0]\n\
  9193.    bl sub_8022A3C\n\
  9194.    ldrb r1, [r4]\n\
  9195.    lsls r0, r1, 2\n\
  9196.    adds r0, r1\n\
  9197.    lsls r0, 2\n\
  9198.    adds r0, r6\n\
  9199.    ldrb r1, [r0]\n\
  9200.    movs r2, 0x40\n\
  9201.    orrs r1, r2\n\
  9202.    strb r1, [r0]\n\
  9203.    b _08022EB8\n\
  9204.    .align 2, 0\n\
  9205. _08022E94: .4byte gSpecialStatuses\n\
  9206. _08022E98: .4byte gSharedMem\n\
  9207. _08022E9C: .4byte 0x00016069\n\
  9208. _08022EA0:\n\
  9209.    movs r0, 0x2\n\
  9210.    mov r2, r9\n\
  9211.    ands r2, r0\n\
  9212.    cmp r2, 0\n\
  9213.    bne _08022EB8\n\
  9214.    movs r0, 0\n\
  9215.    movs r1, 0x2\n\
  9216.    bl EmitLinkStandbyMsg\n\
  9217.    ldrb r0, [r4]\n\
  9218.    bl MarkBufferBankForExecution\n\
  9219. _08022EB8:\n\
  9220.    ldr r1, _08022EE8 @ =gSpecialStatuses\n\
  9221.    ldrb r0, [r1]\n\
  9222.    lsls r0, 25\n\
  9223.    cmp r0, 0\n\
  9224.    blt _08022F0C\n\
  9225.    adds r0, r1, 0\n\
  9226.    adds r0, 0x28\n\
  9227.    ldrb r0, [r0]\n\
  9228.    lsls r0, 25\n\
  9229.    cmp r0, 0\n\
  9230.    blt _08022F0C\n\
  9231.    cmp r5, 0\n\
  9232.    beq _08022F0C\n\
  9233.    ldr r0, _08022EEC @ =gAbsentBattlerFlags\n\
  9234.    ldrb r1, [r0]\n\
  9235.    ldr r0, _08022EF0 @ =gBitTable\n\
  9236.    ldr r0, [r0]\n\
  9237.    ands r1, r0\n\
  9238.    cmp r1, 0\n\
  9239.    beq _08022EF8\n\
  9240.    ldr r1, _08022EF4 @ =gActiveBattler\n\
  9241.    movs r0, 0x2\n\
  9242.    strb r0, [r1]\n\
  9243.    b _08022EFC\n\
  9244.    .align 2, 0\n\
  9245. _08022EE8: .4byte gSpecialStatuses\n\
  9246. _08022EEC: .4byte gAbsentBattlerFlags\n\
  9247. _08022EF0: .4byte gBitTable\n\
  9248. _08022EF4: .4byte gActiveBattler\n\
  9249. _08022EF8:\n\
  9250.    ldr r0, _08022F3C @ =gActiveBattler\n\
  9251.    strb r1, [r0]\n\
  9252. _08022EFC:\n\
  9253.    movs r0, 0\n\
  9254.    movs r1, 0x2\n\
  9255.    bl EmitLinkStandbyMsg\n\
  9256.    ldr r0, _08022F3C @ =gActiveBattler\n\
  9257.    ldrb r0, [r0]\n\
  9258.    bl MarkBufferBankForExecution\n\
  9259. _08022F0C:\n\
  9260.    ldr r1, _08022F40 @ =gSpecialStatuses\n\
  9261.    ldrb r0, [r1, 0x14]\n\
  9262.    lsls r0, 25\n\
  9263.    cmp r0, 0\n\
  9264.    blt _08022F62\n\
  9265.    adds r0, r1, 0\n\
  9266.    adds r0, 0x3C\n\
  9267.    ldrb r0, [r0]\n\
  9268.    lsls r0, 25\n\
  9269.    cmp r0, 0\n\
  9270.    blt _08022F62\n\
  9271.    cmp r5, 0\n\
  9272.    beq _08022F62\n\
  9273.    ldr r0, _08022F44 @ =gAbsentBattlerFlags\n\
  9274.    ldrb r0, [r0]\n\
  9275.    ldr r1, _08022F48 @ =gBitTable\n\
  9276.    ldr r1, [r1, 0x4]\n\
  9277.    ands r0, r1\n\
  9278.    cmp r0, 0\n\
  9279.    beq _08022F4C\n\
  9280.    ldr r1, _08022F3C @ =gActiveBattler\n\
  9281.    movs r0, 0x3\n\
  9282.    b _08022F50\n\
  9283.    .align 2, 0\n\
  9284. _08022F3C: .4byte gActiveBattler\n\
  9285. _08022F40: .4byte gSpecialStatuses\n\
  9286. _08022F44: .4byte gAbsentBattlerFlags\n\
  9287. _08022F48: .4byte gBitTable\n\
  9288. _08022F4C:\n\
  9289.    ldr r1, _08022F6C @ =gActiveBattler\n\
  9290.    movs r0, 0x1\n\
  9291. _08022F50:\n\
  9292.    strb r0, [r1]\n\
  9293.    movs r0, 0\n\
  9294.    movs r1, 0x2\n\
  9295.    bl EmitLinkStandbyMsg\n\
  9296.    ldr r0, _08022F6C @ =gActiveBattler\n\
  9297.    ldrb r0, [r0]\n\
  9298.    bl MarkBufferBankForExecution\n\
  9299. _08022F62:\n\
  9300.    ldr r1, _08022F70 @ =gBattlescriptCurrInstr\n\
  9301.    ldr r0, [r1]\n\
  9302.    adds r0, 0x6\n\
  9303.    str r0, [r1]\n\
  9304.    b _08023302\n\
  9305.    .align 2, 0\n\
  9306. _08022F6C: .4byte gActiveBattler\n\
  9307. _08022F70: .4byte gBattlescriptCurrInstr\n\
  9308. _08022F74:\n\
  9309.    cmp r0, 0x6\n\
  9310.    beq _08022F7A\n\
  9311.    b _08023170\n\
  9312. _08022F7A:\n\
  9313.    ldr r0, _08022FF0 @ =gBattleTypeFlags\n\
  9314.    ldrh r2, [r0]\n\
  9315.    movs r0, 0x40\n\
  9316.    ands r0, r2\n\
  9317.    cmp r0, 0\n\
  9318.    beq _08022F88\n\
  9319.    b _0802310C\n\
  9320. _08022F88:\n\
  9321.    movs r0, 0x1\n\
  9322.    ands r0, r2\n\
  9323.    cmp r0, 0\n\
  9324.    bne _08022F92\n\
  9325.    b _0802310C\n\
  9326. _08022F92:\n\
  9327.    ldr r7, _08022FF4 @ =gHitMarker\n\
  9328.    ldr r0, [r7]\n\
  9329.    lsrs r5, r0, 28\n\
  9330.    ldr r4, _08022FF8 @ =gBitTable\n\
  9331.    ldr r0, [r4, 0x8]\n\
  9332.    ands r0, r5\n\
  9333.    cmp r0, 0\n\
  9334.    beq _0802303A\n\
  9335.    ldr r0, [r4]\n\
  9336.    ands r0, r5\n\
  9337.    cmp r0, 0\n\
  9338.    beq _0802303A\n\
  9339.    ldr r6, _08022FFC @ =gActiveBattler\n\
  9340.    movs r0, 0x2\n\
  9341.    strb r0, [r6]\n\
  9342.    ldr r0, _08023000 @ =gBattleBufferB\n\
  9343.    ldrb r1, [r0, 0x1]\n\
  9344.    movs r0, 0x2\n\
  9345.    movs r2, 0x6\n\
  9346.    bl sub_8018018\n\
  9347.    lsls r0, 24\n\
  9348.    cmp r0, 0\n\
  9349.    beq _08023008\n\
  9350.    ldr r2, _08023004 @ =gAbsentBattlerFlags\n\
  9351.    ldrb r0, [r6]\n\
  9352.    lsls r0, 2\n\
  9353.    adds r0, r4\n\
  9354.    ldr r0, [r0]\n\
  9355.    ldrb r1, [r2]\n\
  9356.    orrs r0, r1\n\
  9357.    strb r0, [r2]\n\
  9358.    ldrb r0, [r6]\n\
  9359.    lsls r0, 2\n\
  9360.    adds r0, r4\n\
  9361.    ldr r1, [r0]\n\
  9362.    lsls r1, 28\n\
  9363.    ldr r0, [r7]\n\
  9364.    bics r0, r1\n\
  9365.    str r0, [r7]\n\
  9366.    movs r0, 0\n\
  9367.    bl Emitcmd42\n\
  9368.    ldrb r0, [r6]\n\
  9369.    bl MarkBufferBankForExecution\n\
  9370.    b _0802303A\n\
  9371.    .align 2, 0\n\
  9372. _08022FF0: .4byte gBattleTypeFlags\n\
  9373. _08022FF4: .4byte gHitMarker\n\
  9374. _08022FF8: .4byte gBitTable\n\
  9375. _08022FFC: .4byte gActiveBattler\n\
  9376. _08023000: .4byte gBattleBufferB\n\
  9377. _08023004: .4byte gAbsentBattlerFlags\n\
  9378. _08023008:\n\
  9379.    ldr r4, _08023098 @ =gSpecialStatuses\n\
  9380.    ldrb r0, [r6]\n\
  9381.    lsls r1, r0, 2\n\
  9382.    adds r1, r0\n\
  9383.    lsls r1, 2\n\
  9384.    adds r1, r4\n\
  9385.    ldrb r0, [r1]\n\
  9386.    lsls r0, 25\n\
  9387.    cmp r0, 0\n\
  9388.    blt _0802303A\n\
  9389.    ldr r0, _0802309C @ =gSharedMem\n\
  9390.    ldr r1, _080230A0 @ =0x00016068\n\
  9391.    adds r0, r1\n\
  9392.    ldrb r0, [r0]\n\
  9393.    bl sub_8022A3C\n\
  9394.    ldrb r1, [r6]\n\
  9395.    lsls r0, r1, 2\n\
  9396.    adds r0, r1\n\
  9397.    lsls r0, 2\n\
  9398.    adds r0, r4\n\
  9399.    ldrb r1, [r0]\n\
  9400.    movs r2, 0x40\n\
  9401.    orrs r1, r2\n\
  9402.    strb r1, [r0]\n\
  9403. _0802303A:\n\
  9404.    ldr r4, _080230A4 @ =gBitTable\n\
  9405.    ldr r0, [r4, 0xC]\n\
  9406.    ands r0, r5\n\
  9407.    cmp r0, 0\n\
  9408.    beq _080230EE\n\
  9409.    ldr r0, [r4, 0x4]\n\
  9410.    ands r5, r0\n\
  9411.    cmp r5, 0\n\
  9412.    beq _080230EE\n\
  9413.    ldr r5, _080230A8 @ =gActiveBattler\n\
  9414.    movs r0, 0x3\n\
  9415.    strb r0, [r5]\n\
  9416.    ldr r0, _080230AC @ =gBattleBufferB\n\
  9417.    ldr r2, _080230B0 @ =0x00000201\n\
  9418.    adds r0, r2\n\
  9419.    ldrb r1, [r0]\n\
  9420.    movs r0, 0x3\n\
  9421.    movs r2, 0x6\n\
  9422.    bl sub_8018018\n\
  9423.    lsls r0, 24\n\
  9424.    cmp r0, 0\n\
  9425.    beq _080230BC\n\
  9426.    ldr r2, _080230B4 @ =gAbsentBattlerFlags\n\
  9427.    ldrb r0, [r5]\n\
  9428.    lsls r0, 2\n\
  9429.    adds r0, r4\n\
  9430.    ldr r0, [r0]\n\
  9431.    ldrb r1, [r2]\n\
  9432.    orrs r0, r1\n\
  9433.    strb r0, [r2]\n\
  9434.    ldr r2, _080230B8 @ =gHitMarker\n\
  9435.    ldrb r0, [r5]\n\
  9436.    lsls r0, 2\n\
  9437.    adds r0, r4\n\
  9438.    ldr r1, [r0]\n\
  9439.    lsls r1, 28\n\
  9440.    ldr r0, [r2]\n\
  9441.    bics r0, r1\n\
  9442.    str r0, [r2]\n\
  9443.    movs r0, 0\n\
  9444.    bl Emitcmd42\n\
  9445.    ldrb r0, [r5]\n\
  9446.    bl MarkBufferBankForExecution\n\
  9447.    b _080230EE\n\
  9448.    .align 2, 0\n\
  9449. _08023098: .4byte gSpecialStatuses\n\
  9450. _0802309C: .4byte gSharedMem\n\
  9451. _080230A0: .4byte 0x00016068\n\
  9452. _080230A4: .4byte gBitTable\n\
  9453. _080230A8: .4byte gActiveBattler\n\
  9454. _080230AC: .4byte gBattleBufferB\n\
  9455. _080230B0: .4byte 0x00000201\n\
  9456. _080230B4: .4byte gAbsentBattlerFlags\n\
  9457. _080230B8: .4byte gHitMarker\n\
  9458. _080230BC:\n\
  9459.    ldr r4, _080230FC @ =gSpecialStatuses\n\
  9460.    ldrb r0, [r5]\n\
  9461.    lsls r1, r0, 2\n\
  9462.    adds r1, r0\n\
  9463.    lsls r1, 2\n\
  9464.    adds r1, r4\n\
  9465.    ldrb r0, [r1]\n\
  9466.    lsls r0, 25\n\
  9467.    cmp r0, 0\n\
  9468.    blt _080230EE\n\
  9469.    ldr r0, _08023100 @ =gSharedMem\n\
  9470.    ldr r1, _08023104 @ =0x00016069\n\
  9471.    adds r0, r1\n\
  9472.    ldrb r0, [r0]\n\
  9473.    bl sub_8022A3C\n\
  9474.    ldrb r1, [r5]\n\
  9475.    lsls r0, r1, 2\n\
  9476.    adds r0, r1\n\
  9477.    lsls r0, 2\n\
  9478.    adds r0, r4\n\
  9479.    ldrb r1, [r0]\n\
  9480.    movs r2, 0x40\n\
  9481.    orrs r1, r2\n\
  9482.    strb r1, [r0]\n\
  9483. _080230EE:\n\
  9484.    ldr r1, _08023108 @ =gBattlescriptCurrInstr\n\
  9485.    ldr r0, [r1]\n\
  9486.    adds r0, 0x6\n\
  9487.    str r0, [r1]\n\
  9488.    mov r12, r1\n\
  9489.    b _08023110\n\
  9490.    .align 2, 0\n\
  9491. _080230FC: .4byte gSpecialStatuses\n\
  9492. _08023100: .4byte gSharedMem\n\
  9493. _08023104: .4byte 0x00016069\n\
  9494. _08023108: .4byte gBattlescriptCurrInstr\n\
  9495. _0802310C:\n\
  9496.    adds r0, r1, 0x6\n\
  9497.    str r0, [r6]\n\
  9498. _08023110:\n\
  9499.    ldr r0, _08023160 @ =gHitMarker\n\
  9500.    ldr r0, [r0]\n\
  9501.    lsrs r5, r0, 28\n\
  9502.    ldr r1, _08023164 @ =gBank1\n\
  9503.    movs r0, 0\n\
  9504.    strb r0, [r1]\n\
  9505.    ldr r4, _08023168 @ =gBitTable\n\
  9506.    ldr r2, [r4]\n\
  9507.    ands r2, r5\n\
  9508.    ldr r6, _0802316C @ =gBattlersCount\n\
  9509.    cmp r2, 0\n\
  9510.    bne _0802314C\n\
  9511.    adds r7, r6, 0\n\
  9512.    ldrb r0, [r6]\n\
  9513.    cmp r2, r0\n\
  9514.    bcs _0802314C\n\
  9515.    adds r3, r1, 0\n\
  9516. _08023132:\n\
  9517.    ldrb r0, [r3]\n\
  9518.    adds r0, 0x1\n\
  9519.    strb r0, [r3]\n\
  9520.    ldrb r2, [r3]\n\
  9521.    lsls r0, r2, 2\n\
  9522.    adds r0, r4\n\
  9523.    ldr r0, [r0]\n\
  9524.    ands r0, r5\n\
  9525.    cmp r0, 0\n\
  9526.    bne _0802314C\n\
  9527.    ldrb r0, [r7]\n\
  9528.    cmp r2, r0\n\
  9529.    bcc _08023132\n\
  9530. _0802314C:\n\
  9531.    ldrb r0, [r1]\n\
  9532.    ldrb r6, [r6]\n\
  9533.    cmp r0, r6\n\
  9534.    beq _08023156\n\
  9535.    b _08023302\n\
  9536. _08023156:\n\
  9537.    mov r1, r8\n\
  9538.    mov r2, r12\n\
  9539.    str r1, [r2]\n\
  9540.    b _08023302\n\
  9541.    .align 2, 0\n\
  9542. _08023160: .4byte gHitMarker\n\
  9543. _08023164: .4byte gBank1\n\
  9544. _08023168: .4byte gBitTable\n\
  9545. _0802316C: .4byte gBattlersCount\n\
  9546. _08023170:\n\
  9547.    movs r0, 0x80\n\
  9548.    ands r0, r2\n\
  9549.    movs r5, 0x1\n\
  9550.    cmp r0, 0\n\
  9551.    beq _0802317C\n\
  9552.    movs r5, 0\n\
  9553. _0802317C:\n\
  9554.    movs r0, 0x7F\n\
  9555.    ands r0, r2\n\
  9556.    bl GetBattleBank\n\
  9557.    lsls r0, 24\n\
  9558.    lsrs r7, r0, 24\n\
  9559.    ldr r1, _080231A4 @ =gSpecialStatuses\n\
  9560.    lsls r0, r7, 2\n\
  9561.    adds r0, r7\n\
  9562.    lsls r0, 2\n\
  9563.    adds r0, r1\n\
  9564.    ldrb r0, [r0]\n\
  9565.    lsls r0, 25\n\
  9566.    cmp r0, 0\n\
  9567.    bge _080231A8\n\
  9568.    ldr r0, [r6]\n\
  9569.    adds r0, 0x6\n\
  9570.    str r0, [r6]\n\
  9571.    b _08023302\n\
  9572.    .align 2, 0\n\
  9573. _080231A4: .4byte gSpecialStatuses\n\
  9574. _080231A8:\n\
  9575.    adds r0, r7, 0\n\
  9576.    movs r1, 0x6\n\
  9577.    movs r2, 0x6\n\
  9578.    bl sub_8018018\n\
  9579.    lsls r0, 24\n\
  9580.    cmp r0, 0\n\
  9581.    beq _080231F8\n\
  9582.    ldr r2, _080231E8 @ =gActiveBattler\n\
  9583.    strb r7, [r2]\n\
  9584.    ldr r3, _080231EC @ =gAbsentBattlerFlags\n\
  9585.    ldr r4, _080231F0 @ =gBitTable\n\
  9586.    ldrb r0, [r2]\n\
  9587.    lsls r0, 2\n\
  9588.    adds r0, r4\n\
  9589.    ldr r0, [r0]\n\
  9590.    ldrb r1, [r3]\n\
  9591.    orrs r0, r1\n\
  9592.    strb r0, [r3]\n\
  9593.    ldr r3, _080231F4 @ =gHitMarker\n\
  9594.    ldrb r0, [r2]\n\
  9595.    lsls r0, 2\n\
  9596.    adds r0, r4\n\
  9597.    ldr r1, [r0]\n\
  9598.    lsls r1, 28\n\
  9599.    ldr r0, [r3]\n\
  9600.    bics r0, r1\n\
  9601.    str r0, [r3]\n\
  9602.    mov r0, r8\n\
  9603.    str r0, [r6]\n\
  9604.    b _08023302\n\
  9605.    .align 2, 0\n\
  9606. _080231E8: .4byte gActiveBattler\n\
  9607. _080231EC: .4byte gAbsentBattlerFlags\n\
  9608. _080231F0: .4byte gBitTable\n\
  9609. _080231F4: .4byte gHitMarker\n\
  9610. _080231F8:\n\
  9611.    ldr r4, _080232A0 @ =gActiveBattler\n\
  9612.    strb r7, [r4]\n\
  9613.    ldr r3, _080232A4 @ =gSharedMem\n\
  9614.    ldrb r0, [r4]\n\
  9615.    ldr r2, _080232A8 @ =0x00016064\n\
  9616.    adds r1, r0, r2\n\
  9617.    adds r1, r3\n\
  9618.    ldr r2, _080232AC @ =gBattlerPartyIndexes\n\
  9619.    lsls r0, 1\n\
  9620.    adds r0, r2\n\
  9621.    ldrh r0, [r0]\n\
  9622.    strb r0, [r1]\n\
  9623.    ldrb r1, [r4]\n\
  9624.    movs r0, 0x2\n\
  9625.    eors r0, r1\n\
  9626.    ldr r1, _080232B0 @ =0x00016068\n\
  9627.    adds r0, r1\n\
  9628.    adds r0, r3\n\
  9629.    ldrb r2, [r0]\n\
  9630.    ldrb r1, [r4]\n\
  9631.    lsls r0, r1, 1\n\
  9632.    adds r0, r1\n\
  9633.    ldr r1, _080232B4 @ =0x0001606c\n\
  9634.    adds r3, r1\n\
  9635.    adds r0, r3\n\
  9636.    str r0, [sp]\n\
  9637.    movs r0, 0\n\
  9638.    adds r1, r5, 0\n\
  9639.    movs r3, 0\n\
  9640.    bl EmitChoosePokemon\n\
  9641.    ldrb r0, [r4]\n\
  9642.    bl MarkBufferBankForExecution\n\
  9643.    ldr r0, [r6]\n\
  9644.    adds r0, 0x6\n\
  9645.    str r0, [r6]\n\
  9646.    ldrb r0, [r4]\n\
  9647.    bl GetBattlerPosition\n\
  9648.    lsls r0, 24\n\
  9649.    cmp r0, 0\n\
  9650.    bne _0802325A\n\
  9651.    ldr r1, _080232B8 @ =gBattleResults\n\
  9652.    ldrb r0, [r1, 0x2]\n\
  9653.    cmp r0, 0xFE\n\
  9654.    bhi _0802325A\n\
  9655.    adds r0, 0x1\n\
  9656.    strb r0, [r1, 0x2]\n\
  9657. _0802325A:\n\
  9658.    ldr r0, _080232BC @ =gBattleTypeFlags\n\
  9659.    ldrh r1, [r0]\n\
  9660.    movs r0, 0x40\n\
  9661.    ands r0, r1\n\
  9662.    cmp r0, 0\n\
  9663.    beq _080232C4\n\
  9664.    ldr r1, _080232A0 @ =gActiveBattler\n\
  9665.    movs r0, 0\n\
  9666.    strb r0, [r1]\n\
  9667.    ldr r0, _080232C0 @ =gBattlersCount\n\
  9668.    ldrb r0, [r0]\n\
  9669.    cmp r0, 0\n\
  9670.    beq _08023302\n\
  9671.    adds r4, r1, 0\n\
  9672. _08023276:\n\
  9673.    ldrb r0, [r4]\n\
  9674.    cmp r0, r7\n\
  9675.    beq _0802328A\n\
  9676.    movs r0, 0\n\
  9677.    movs r1, 0x2\n\
  9678.    bl EmitLinkStandbyMsg\n\
  9679.    ldrb r0, [r4]\n\
  9680.    bl MarkBufferBankForExecution\n\
  9681. _0802328A:\n\
  9682.    ldrb r0, [r4]\n\
  9683.    adds r0, 0x1\n\
  9684.    strb r0, [r4]\n\
  9685.    ldr r1, _080232C0 @ =gBattlersCount\n\
  9686.    lsls r0, 24\n\
  9687.    lsrs r0, 24\n\
  9688.    ldrb r1, [r1]\n\
  9689.    cmp r0, r1\n\
  9690.    bcc _08023276\n\
  9691.    b _08023302\n\
  9692.    .align 2, 0\n\
  9693. _080232A0: .4byte gActiveBattler\n\
  9694. _080232A4: .4byte gSharedMem\n\
  9695. _080232A8: .4byte 0x00016064\n\
  9696. _080232AC: .4byte gBattlerPartyIndexes\n\
  9697. _080232B0: .4byte 0x00016068\n\
  9698. _080232B4: .4byte 0x0001606c\n\
  9699. _080232B8: .4byte gBattleResults\n\
  9700. _080232BC: .4byte gBattleTypeFlags\n\
  9701. _080232C0: .4byte gBattlersCount\n\
  9702. _080232C4:\n\
  9703.    adds r0, r7, 0\n\
  9704.    bl GetBattlerPosition\n\
  9705.    movs r1, 0x1\n\
  9706.    eors r0, r1\n\
  9707.    lsls r0, 24\n\
  9708.    lsrs r0, 24\n\
  9709.    bl GetBattlerAtPosition\n\
  9710.    ldr r4, _08023310 @ =gActiveBattler\n\
  9711.    strb r0, [r4]\n\
  9712.    ldr r0, _08023314 @ =gAbsentBattlerFlags\n\
  9713.    ldrb r1, [r0]\n\
  9714.    ldr r2, _08023318 @ =gBitTable\n\
  9715.    ldrb r3, [r4]\n\
  9716.    lsls r0, r3, 2\n\
  9717.    adds r0, r2\n\
  9718.    ldr r0, [r0]\n\
  9719.    ands r1, r0\n\
  9720.    cmp r1, 0\n\
  9721.    beq _080232F4\n\
  9722.    movs r0, 0x2\n\
  9723.    eors r3, r0\n\
  9724.    strb r3, [r4]\n\
  9725. _080232F4:\n\
  9726.    movs r0, 0\n\
  9727.    movs r1, 0x2\n\
  9728.    bl EmitLinkStandbyMsg\n\
  9729.    ldrb r0, [r4]\n\
  9730.    bl MarkBufferBankForExecution\n\
  9731. _08023302:\n\
  9732.    add sp, 0x4\n\
  9733.    pop {r3,r4}\n\
  9734.    mov r8, r3\n\
  9735.    mov r9, r4\n\
  9736.    pop {r4-r7}\n\
  9737.    pop {r0}\n\
  9738.    bx r0\n\
  9739.    .align 2, 0\n\
  9740. _08023310: .4byte gActiveBattler\n\
  9741. _08023314: .4byte gAbsentBattlerFlags\n\
  9742. _08023318: .4byte gBitTable\n\
  9743.        .syntax divided");
  9744. }
  9745.  
  9746. static void atk51_switchhandleorder(void)
  9747. {
  9748.     int i;
  9749.     if (gBattleExecBuffer)
  9750.         return;
  9751.  
  9752.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  9753.     switch (T2_READ_8(gBattlescriptCurrInstr + 2))
  9754.     {
  9755.     case 0:
  9756.         for (i = 0; i < gBattlersCount; i++)
  9757.         {
  9758.             if (gBattleBufferB[i][0] == 0x22)
  9759.                 ewram16068arr(i) = gBattleBufferB[i][1];
  9760.         }
  9761.         break;
  9762.     case 1:
  9763.         if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
  9764.             sub_8012258(gActiveBattler);
  9765.         break;
  9766.     case 2:
  9767.         gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1];
  9768.         ewram16068arr(gActiveBattler) = gBattleBufferB[gActiveBattler][1];
  9769.         if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
  9770.         {
  9771.             ewram1606Carr(0, gActiveBattler) &= 0xF;
  9772.             ewram1606Carr(0, gActiveBattler) |= (gBattleBufferB[gActiveBattler][2] & 0xF0);
  9773.             ewram1606Carr(1, gActiveBattler) = gBattleBufferB[gActiveBattler][3];
  9774.             ewram1606Carr(0, (gActiveBattler ^ 2)) &= (0xF0);
  9775.             ewram1606Carr(0, (gActiveBattler ^ 2)) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;
  9776.             ewram1606Carr(2, (gActiveBattler ^ 2)) = gBattleBufferB[gActiveBattler][3];
  9777.         }
  9778.         else
  9779.             sub_8012258(gActiveBattler);
  9780.  
  9781.         gBattleTextBuff1[0] = 0xFD;
  9782.         gBattleTextBuff1[1] = 6;
  9783.         gBattleTextBuff1[2] = gBattleMons[gBankAttacker].species;
  9784.         gBattleTextBuff1[3] = gBattleMons[gBankAttacker].species >> 8;
  9785.         gBattleTextBuff1[4] = 0xFF;
  9786.  
  9787.         gBattleTextBuff2[0] = 0xFD;
  9788.         gBattleTextBuff2[1] = 7;
  9789.         gBattleTextBuff2[2] = gActiveBattler;
  9790.         gBattleTextBuff2[3] = gBattleBufferB[gActiveBattler][1];
  9791.         gBattleTextBuff2[4] = 0xFF;
  9792.         break;
  9793.     }
  9794.     gBattlescriptCurrInstr += 3;
  9795. }
  9796.  
  9797. static void atk52_switchineffects(void)
  9798. {
  9799.     int i;
  9800.  
  9801.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  9802.     sub_80157C4(gActiveBattler);
  9803.     gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
  9804.     gSpecialStatuses[gActiveBattler].flag40 = 0;
  9805.  
  9806.     if (!(gSideAffecting[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED) && (gSideAffecting[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES)
  9807.         && gBattleMons[gActiveBattler].type1 != TYPE_FLYING && gBattleMons[gActiveBattler].type2 != TYPE_FLYING && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE)
  9808.     {
  9809.         u8 spikesDmg;
  9810.  
  9811.         gSideAffecting[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED;
  9812.  
  9813.         spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2;
  9814.         gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (spikesDmg);
  9815.         if (gBattleMoveDamage == 0)
  9816.             gBattleMoveDamage = 1;
  9817.  
  9818.         gBattleStruct->scriptingActive = gActiveBattler;
  9819.         BattleScriptPushCursor();
  9820.  
  9821.         if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0)
  9822.             gBattlescriptCurrInstr = BattleScript_SpikesOnTarget;
  9823.         else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1)
  9824.             gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker;
  9825.         else
  9826.             gBattlescriptCurrInstr = BattleScript_SpikesOngBank1;
  9827.     }
  9828.     else
  9829.     {
  9830.         if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT)
  9831.         {
  9832.             gDisableStructs[gActiveBattler].truantCounter = 1;
  9833.         }
  9834.  
  9835.         if (AbilityBattleEffects(0, gActiveBattler, 0, 0, 0) == 0 && ItemBattleEffects(0, gActiveBattler, 0) == 0)
  9836.         {
  9837.             gSideAffecting[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED);
  9838.  
  9839.             for (i = 0; i < gBattlersCount; i++)
  9840.             {
  9841.                 if (gBanksByTurnOrder[i] == gActiveBattler)
  9842.                     gActionsByTurnOrder[i] = 0xC;
  9843.             }
  9844.  
  9845.             for (i = 0; i < gBattlersCount; i++)
  9846.             {
  9847.                 *(HP_ON_SWITCHOUT + GetBattlerSide(i)) = gBattleMons[i].hp;
  9848.             }
  9849.  
  9850.             if (T2_READ_8(gBattlescriptCurrInstr + 1) == 5)
  9851.             {
  9852.                 u32 hitmark = gHitMarker >> 0x1C;
  9853.                 gBank1++;
  9854.                 while (1)
  9855.                 {
  9856.                     if (hitmark & gBitTable[gBank1] && !(gAbsentBattlerFlags & gBitTable[gBank1]))
  9857.                         break;
  9858.                     if (gBank1 >= gBattlersCount)
  9859.                         break;
  9860.                     gBank1++;
  9861.                 }
  9862.             }
  9863.             gBattlescriptCurrInstr += 2;
  9864.         }
  9865.     }
  9866. }
  9867.  
  9868. static void atk53_trainerslidein(void)
  9869. {
  9870.     if (!T2_READ_8(gBattlescriptCurrInstr + 1))
  9871.         gActiveBattler = GetBattlerAtPosition(0);
  9872.     else
  9873.         gActiveBattler = GetBattlerAtPosition(1);
  9874.  
  9875.     EmitTrainerSlide(0);
  9876.     MarkBufferBankForExecution(gActiveBattler);
  9877.     gBattlescriptCurrInstr += 2;
  9878. }
  9879.  
  9880. static void atk54_playse(void)
  9881. {
  9882.     gActiveBattler = gBankAttacker;
  9883.     EmitEffectivenessSound(0, T2_READ_16(gBattlescriptCurrInstr + 1));
  9884.     MarkBufferBankForExecution(gActiveBattler);
  9885.     gBattlescriptCurrInstr += 3;
  9886. }
  9887.  
  9888. static void atk55_fanfare(void)
  9889. {
  9890.     gActiveBattler = gBankAttacker;
  9891.     Emitcmd44(0, T2_READ_16(gBattlescriptCurrInstr + 1));
  9892.     MarkBufferBankForExecution(gActiveBattler);
  9893.     gBattlescriptCurrInstr += 3;
  9894. }
  9895.  
  9896. static void atk56_playfaintcry(void)
  9897. {
  9898.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  9899.     EmitFaintingCry(0);
  9900.     MarkBufferBankForExecution(gActiveBattler);
  9901.     gBattlescriptCurrInstr += 2;
  9902. }
  9903.  
  9904. static void atk57(void)
  9905. {
  9906.     gActiveBattler = GetBattlerAtPosition(0);
  9907.     Emitcmd55(0, gBattleOutcome);
  9908.     MarkBufferBankForExecution(gActiveBattler);
  9909.     gBattlescriptCurrInstr += 1;
  9910. }
  9911.  
  9912. static void atk58_returntoball(void)
  9913. {
  9914.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  9915.     EmitReturnPokeToBall(0, 1);
  9916.     MarkBufferBankForExecution(gActiveBattler);
  9917.     gBattlescriptCurrInstr += 2;
  9918. }
  9919.  
  9920. void atk59_handlelearnnewmove(void)
  9921. {
  9922.     u8* loc1 = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  9923.     u8* loc2 = T1_READ_PTR(gBattlescriptCurrInstr + 5);
  9924.  
  9925.     u16 ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterID], T2_READ_8(gBattlescriptCurrInstr + 9));
  9926.     while (ret == 0xFFFE)
  9927.         ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterID], 0);
  9928.  
  9929.     if (ret == 0)
  9930.     {
  9931.         gBattlescriptCurrInstr = loc2;
  9932.     }
  9933.     else if (ret == 0xFFFF)
  9934.     {
  9935.         gBattlescriptCurrInstr += 10;
  9936.     }
  9937.     else
  9938.     {
  9939.         gActiveBattler = GetBattlerAtPosition(0);
  9940.         if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))
  9941.             GiveMoveToBattleMon(&gBattleMons[gActiveBattler], ret);
  9942.         if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) //what is else if
  9943.         {
  9944.             gActiveBattler = GetBattlerAtPosition(2);
  9945.             if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))
  9946.                 GiveMoveToBattleMon(&gBattleMons[gActiveBattler], ret);
  9947.         }
  9948.         gBattlescriptCurrInstr = loc1;
  9949.     }
  9950. }
  9951.  
  9952. void sub_8023A80(void)
  9953. {
  9954.     sub_802BBD4(0x18, 8, 0x1D, 0xD, 0);
  9955.     Text_InitWindow(&gUnknown_03004210, BattleText_YesNo, 0x100, 0x19, 0x9);
  9956.     Text_PrintWindow8002F44(&gUnknown_03004210);
  9957.     MenuCursor_Create814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20);
  9958. }
  9959.  
  9960. void sub_8023AD8(void)
  9961. {
  9962.     sub_802BBD4(0x18, 8, 0x1D, 0xD, 1);
  9963.     DestroyMenuCursor();
  9964. }
  9965.  
  9966. static void atk5A_yesnoboxlearnmove(void)
  9967. {
  9968.     gActiveBattler = 0;
  9969.     switch (gBattleStruct->atk5A_StateTracker)
  9970.     {
  9971.     case 0:
  9972.         sub_8023A80();
  9973.         gBattleStruct->atk5A_StateTracker++;
  9974.         gBattleCommunication[1] = 0;
  9975.         sub_802BC6C();
  9976.         break;
  9977.     case 1:
  9978.         if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0)
  9979.         {
  9980.             PlaySE(SE_SELECT);
  9981.             nullsub_6();
  9982.             gBattleCommunication[1] = 0;
  9983.             sub_802BC6C();
  9984.         }
  9985.         if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0)
  9986.         {
  9987.             PlaySE(SE_SELECT);
  9988.             nullsub_6();
  9989.             gBattleCommunication[1] = 1;
  9990.             sub_802BC6C();
  9991.         }
  9992.         if (gMain.newKeys & A_BUTTON)
  9993.         {
  9994.             PlaySE(SE_SELECT);
  9995.             if (gBattleCommunication[1] == 0)
  9996.             {
  9997.                 sub_8023AD8();
  9998.                 BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));
  9999.                 gBattleStruct->atk5A_StateTracker++;
  10000.                 return;
  10001.             }
  10002.             goto state_tracker_4;
  10003.         }
  10004.         else if (gMain.newKeys & B_BUTTON)
  10005.         {
  10006.             PlaySE(SE_SELECT);
  10007.           state_tracker_4:
  10008.             gBattleStruct->atk5A_StateTracker = 4;
  10009.         }
  10010.         break;
  10011.     case 2:
  10012.         if (!gPaletteFade.active)
  10013.         {
  10014.             ShowSelectMovePokemonSummaryScreen(gPlayerParty, gBattleStruct->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);
  10015.             gBattleStruct->atk5A_StateTracker++;
  10016.         }
  10017.         break;
  10018.     case 3:
  10019.         if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2)
  10020.         {
  10021.             u8 move_pos = sub_809FA30();
  10022.             if (move_pos == 4)
  10023.             {
  10024.                 gBattleStruct->atk5A_StateTracker = 4;
  10025.             }
  10026.             else
  10027.             {
  10028.                 u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MOVE1 + move_pos);
  10029.                 if (IsHMMove2(move))
  10030.                 {
  10031.                     PrepareStringBattle(0x13F, gActiveBattler);
  10032.                     gBattleStruct->atk5A_StateTracker = 5;
  10033.                 }
  10034.                 else
  10035.                 {
  10036.                     u8 *ptr;
  10037.  
  10038.                     gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  10039.                     ptr = gBattleTextBuff2;
  10040.                     {
  10041.                         ptr[0] = 0xFD;
  10042.                         ptr[1] = 2;
  10043.                         ptr[2] = move;
  10044.                         ptr[3] = ((move & 0xFF00) >> 8);
  10045.                         ptr += 4;
  10046.                     }
  10047.                     ptr[0] = 0xFF;
  10048.                     RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterID], move_pos);
  10049.                     SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterID], gMoveToLearn, move_pos);
  10050.                     if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED)
  10051.                         && !(gDisableStructs[0].unk18_b & gBitTable[move_pos]))
  10052.                     {
  10053.                         RemoveBattleMonPPBonus(&gBattleMons[0], move_pos);
  10054.                         SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, move_pos);
  10055.                     }
  10056.                     if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterID && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED)
  10057.                         && !(gDisableStructs[2].unk18_b & gBitTable[move_pos]))
  10058.                     {
  10059.                         RemoveBattleMonPPBonus(&gBattleMons[2], move_pos);
  10060.                         SetBattleMonMoveSlot(&gBattleMons[2], gMoveToLearn, move_pos);
  10061.                     }
  10062.                 }
  10063.             }
  10064.         }
  10065.         break;
  10066.     case 4:
  10067.         sub_8023AD8();
  10068.         gBattlescriptCurrInstr += 5;
  10069.         break;
  10070.     case 5:
  10071.         if (gBattleExecBuffer == 0)
  10072.         {
  10073.             gBattleStruct->atk5A_StateTracker = 2;
  10074.         }
  10075.         break;
  10076.     }
  10077. }
  10078.  
  10079. static void atk5B_yesnoboxstoplearningmove(void)
  10080. {
  10081.     switch (gBattleStruct->atk5A_StateTracker)
  10082.     {
  10083.     case 0:
  10084.         sub_8023A80();
  10085.         gBattleStruct->atk5A_StateTracker++;
  10086.         gBattleCommunication[1] = 0;
  10087.         sub_802BC6C();
  10088.         break;
  10089.     case 1:
  10090.         if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0)
  10091.         {
  10092.             PlaySE(SE_SELECT);
  10093.             nullsub_6();
  10094.             gBattleCommunication[1] = 0;
  10095.             sub_802BC6C();
  10096.         }
  10097.         if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0)
  10098.         {
  10099.             PlaySE(SE_SELECT);
  10100.             nullsub_6();
  10101.             gBattleCommunication[1] = 1;
  10102.             sub_802BC6C();
  10103.         }
  10104.         if (gMain.newKeys & A_BUTTON)
  10105.         {
  10106.             PlaySE(SE_SELECT);
  10107.             if (gBattleCommunication[1] != 0)
  10108.                 gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  10109.             else
  10110.                 gBattlescriptCurrInstr += 5;
  10111.             sub_8023AD8();
  10112.         }
  10113.         else if (gMain.newKeys & B_BUTTON)
  10114.         {
  10115.             PlaySE(SE_SELECT);
  10116.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  10117.             sub_8023AD8();
  10118.         }
  10119.     }
  10120. }
  10121.  
  10122. static void atk5C_hitanimation(void)
  10123. {
  10124.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  10125.     if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
  10126.         gBattlescriptCurrInstr += 2;
  10127.     else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0)
  10128.     {
  10129.         EmitHitAnimation(0);
  10130.         MarkBufferBankForExecution(gActiveBattler);
  10131.         gBattlescriptCurrInstr += 2;
  10132.     }
  10133.     else
  10134.         gBattlescriptCurrInstr += 2;
  10135. }
  10136.  
  10137. #define MONEY_UNKNOWN ((*(u8*)(ewram_addr + 0x17000 + 0x94)))
  10138.  
  10139. #ifdef NONMATCHING
  10140. static void atk5D_getmoneyreward(void)
  10141. {
  10142.     int i = 0;
  10143.     u8 r5 = 0;
  10144.     u32 money_to_give;
  10145.     if (gTrainerBattleOpponent == 0x400)
  10146.     {
  10147.         money_to_give = 2 * gBattleStruct->moneyMultiplier * MONEY_UNKNOWN;
  10148.     }
  10149.     else
  10150.     {
  10151.         switch(gTrainers[gTrainerBattleOpponent].partyFlags)
  10152.         {
  10153.         case 0:
  10154.             {
  10155.                 const struct PokeTrainerData1 *data = &gTrainers[gTrainerBattleOpponent].party->noItemNoMoves;
  10156.                 r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl;
  10157.             }
  10158.             break;
  10159.         case 2:
  10160.             {
  10161.                 const struct PokeTrainerData2 *data = &gTrainers[gTrainerBattleOpponent].party->itemNoMoves;
  10162.                 r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl;
  10163.             }
  10164.             break;
  10165.         case 1:
  10166.         case 3:
  10167.             {
  10168.                 const struct PokeTrainerData3 *data = &gTrainers[gTrainerBattleOpponent].party->itemMoves;
  10169.                 r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl;
  10170.             }
  10171.             break;
  10172.         }
  10173.         for (; gTrainerMoney[i * 4] != 0xFF && gTrainerMoney[i * 4 + 1] != gTrainers[gTrainerBattleOpponent].trainerClass ; i++) {}
  10174.  
  10175.         money_to_give = (r5 << 2) * gBattleStruct->moneyMultiplier;
  10176.         if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  10177.             money_to_give = 2 * gTrainerMoney[i * 4 + 1] * money_to_give;
  10178.         else
  10179.             money_to_give = 1 * gTrainerMoney[i * 4 + 1] * money_to_give;
  10180.     }
  10181.  
  10182.     AddMoney(&gSaveBlock1.money, money_to_give);
  10183.     gBattleTextBuff1[0] = 0xFD;
  10184.     gBattleTextBuff1[1] = 1;
  10185.     gBattleTextBuff1[2] = 4;
  10186.     gBattleTextBuff1[3] = 5;
  10187.     gBattleTextBuff1[4] = BYTE0(money_to_give);
  10188.     gBattleTextBuff1[5] = BYTE1(money_to_give);
  10189.     gBattleTextBuff1[6] = BYTE2(money_to_give);
  10190.     gBattleTextBuff1[7] = BYTE3(money_to_give);
  10191.     gBattleTextBuff1[8] = 0xFF;
  10192.  
  10193.     gBattlescriptCurrInstr += 1;
  10194. }
  10195. #else
  10196. NAKED
  10197. static void atk5D_getmoneyreward(void)
  10198. {
  10199.     asm(".syntax unified\n\
  10200.        push {r4-r7,lr}\n\
  10201.    mov r7, r8\n\
  10202.    push {r7}\n\
  10203.    movs r6, 0\n\
  10204.    movs r5, 0\n\
  10205.    ldr r0, _08024048 @ =gTrainerBattleOpponent\n\
  10206.    ldrh r2, [r0]\n\
  10207.    movs r1, 0x80\n\
  10208.    lsls r1, 3\n\
  10209.    cmp r2, r1\n\
  10210.    bne _08024058\n\
  10211.    ldr r0, _0802404C @ =gSharedMem + 0x17000\n\
  10212.    adds r1, r0, 0\n\
  10213.    adds r1, 0x94\n\
  10214.    ldrb r2, [r1]\n\
  10215.    ldr r1, _08024050 @ =0xfffff056\n\
  10216.    adds r0, r1\n\
  10217.    ldrb r1, [r0]\n\
  10218.    lsls r0, r1, 2\n\
  10219.    adds r0, r1\n\
  10220.    lsls r0, 2\n\
  10221.    adds r4, r2, 0\n\
  10222.    muls r4, r0\n\
  10223.    ldr r0, _08024054 @ =gSaveBlock1 + 0x490\n\
  10224.    mov r8, r0\n\
  10225.    b _08024140\n\
  10226.    .align 2, 0\n\
  10227. _08024048: .4byte gTrainerBattleOpponent\n\
  10228. _0802404C: .4byte gSharedMem + 0x17000\n\
  10229. _08024050: .4byte 0xfffff056\n\
  10230. _08024054: .4byte gSaveBlock1 + 0x490\n\
  10231. _08024058:\n\
  10232.    ldr r2, _08024074 @ =gTrainers\n\
  10233.    ldrh r1, [r0]\n\
  10234.    lsls r0, r1, 2\n\
  10235.    adds r0, r1\n\
  10236.    lsls r3, r0, 3\n\
  10237.    adds r4, r3, r2\n\
  10238.    ldrb r1, [r4]\n\
  10239.    cmp r1, 0x1\n\
  10240.    beq _080240AE\n\
  10241.    cmp r1, 0x1\n\
  10242.    bgt _08024078\n\
  10243.    cmp r1, 0\n\
  10244.    beq _08024082\n\
  10245.    b _080240C4\n\
  10246.    .align 2, 0\n\
  10247. _08024074: .4byte gTrainers\n\
  10248. _08024078:\n\
  10249.    cmp r1, 0x2\n\
  10250.    beq _08024098\n\
  10251.    cmp r1, 0x3\n\
  10252.    beq _080240AE\n\
  10253.    b _080240C4\n\
  10254. _08024082:\n\
  10255.    adds r0, r2, 0\n\
  10256.    adds r0, 0x24\n\
  10257.    adds r0, r3, r0\n\
  10258.    ldr r1, [r0]\n\
  10259.    adds r0, r4, 0\n\
  10260.    adds r0, 0x20\n\
  10261.    ldrb r0, [r0]\n\
  10262.    lsls r0, 3\n\
  10263.    adds r0, r1\n\
  10264.    subs r0, 0x8\n\
  10265.    b _080240C2\n\
  10266. _08024098:\n\
  10267.    adds r0, r2, 0\n\
  10268.    adds r0, 0x24\n\
  10269.    adds r0, r3, r0\n\
  10270.    ldr r1, [r0]\n\
  10271.    adds r0, r4, 0\n\
  10272.    adds r0, 0x20\n\
  10273.    ldrb r0, [r0]\n\
  10274.    lsls r0, 3\n\
  10275.    adds r0, r1\n\
  10276.    subs r0, 0x8\n\
  10277.    b _080240C2\n\
  10278. _080240AE:\n\
  10279.    adds r0, r2, 0\n\
  10280.    adds r0, 0x24\n\
  10281.    adds r0, r3, r0\n\
  10282.    ldr r1, [r0]\n\
  10283.    adds r0, r4, 0\n\
  10284.    adds r0, 0x20\n\
  10285.    ldrb r0, [r0]\n\
  10286.    lsls r0, 4\n\
  10287.    adds r0, r1\n\
  10288.    subs r0, 0x10\n\
  10289. _080240C2:\n\
  10290.    ldrb r5, [r0, 0x2]\n\
  10291. _080240C4:\n\
  10292.    ldr r0, _08024120 @ =gTrainerMoney\n\
  10293.    lsls r1, r6, 2\n\
  10294.    adds r3, r1, r0\n\
  10295.    ldrb r1, [r3]\n\
  10296.    mov r12, r0\n\
  10297.    lsls r4, r5, 2\n\
  10298.    ldr r5, _08024124 @ =gSharedMem\n\
  10299.    ldr r7, _08024128 @ =gBattleTypeFlags\n\
  10300.    ldr r0, _0802412C @ =gSaveBlock1 + 0x490\n\
  10301.    mov r8, r0\n\
  10302.    cmp r1, 0xFF\n\
  10303.    beq _080240FE\n\
  10304.    ldr r2, _08024130 @ =gTrainers\n\
  10305.    ldr r0, _08024134 @ =gTrainerBattleOpponent\n\
  10306.    ldrh r1, [r0]\n\
  10307.    lsls r0, r1, 2\n\
  10308.    adds r0, r1\n\
  10309.    lsls r0, 3\n\
  10310.    adds r0, r2\n\
  10311.    ldrb r2, [r0, 0x1]\n\
  10312.    adds r1, r3, 0\n\
  10313. _080240EE:\n\
  10314.    ldrb r0, [r1]\n\
  10315.    cmp r0, r2\n\
  10316.    beq _080240FE\n\
  10317.    adds r1, 0x4\n\
  10318.    adds r6, 0x1\n\
  10319.    ldrb r0, [r1]\n\
  10320.    cmp r0, 0xFF\n\
  10321.    bne _080240EE\n\
  10322. _080240FE:\n\
  10323.    ldr r1, _08024138 @ =0x00016056\n\
  10324.    adds r0, r5, r1\n\
  10325.    ldrb r0, [r0]\n\
  10326.    adds r3, r4, 0\n\
  10327.    muls r3, r0\n\
  10328.    lsls r0, r6, 2\n\
  10329.    add r0, r12\n\
  10330.    ldrb r2, [r0, 0x1]\n\
  10331.    ldrh r1, [r7]\n\
  10332.    movs r0, 0x1\n\
  10333.    ands r0, r1\n\
  10334.    cmp r0, 0\n\
  10335.    beq _0802413C\n\
  10336.    lsls r0, r2, 1\n\
  10337.    adds r4, r3, 0\n\
  10338.    muls r4, r0\n\
  10339.    b _08024140\n\
  10340.    .align 2, 0\n\
  10341. _08024120: .4byte gTrainerMoney\n\
  10342. _08024124: .4byte gSharedMem\n\
  10343. _08024128: .4byte gBattleTypeFlags\n\
  10344. _0802412C: .4byte gSaveBlock1 + 0x490\n\
  10345. _08024130: .4byte gTrainers\n\
  10346. _08024134: .4byte gTrainerBattleOpponent\n\
  10347. _08024138: .4byte 0x00016056\n\
  10348. _0802413C:\n\
  10349.    adds r4, r3, 0\n\
  10350.    muls r4, r2\n\
  10351. _08024140:\n\
  10352.    mov r0, r8\n\
  10353.    adds r1, r4, 0\n\
  10354.    bl AddMoney\n\
  10355.    ldr r1, _0802418C @ =gBattleTextBuff1\n\
  10356.    movs r0, 0xFD\n\
  10357.    strb r0, [r1]\n\
  10358.    movs r0, 0x1\n\
  10359.    strb r0, [r1, 0x1]\n\
  10360.    movs r0, 0x4\n\
  10361.    strb r0, [r1, 0x2]\n\
  10362.    movs r0, 0x5\n\
  10363.    strb r0, [r1, 0x3]\n\
  10364.    strb r4, [r1, 0x4]\n\
  10365.    movs r0, 0xFF\n\
  10366.    lsls r0, 8\n\
  10367.    ands r0, r4\n\
  10368.    lsrs r0, 8\n\
  10369.    strb r0, [r1, 0x5]\n\
  10370.    movs r0, 0xFF\n\
  10371.    lsls r0, 16\n\
  10372.    ands r0, r4\n\
  10373.    lsrs r0, 16\n\
  10374.    strb r0, [r1, 0x6]\n\
  10375.    lsrs r0, r4, 24\n\
  10376.    strb r0, [r1, 0x7]\n\
  10377.    movs r0, 0xFF\n\
  10378.    strb r0, [r1, 0x8]\n\
  10379.    ldr r1, _08024190 @ =gBattlescriptCurrInstr\n\
  10380.    ldr r0, [r1]\n\
  10381.    adds r0, 0x1\n\
  10382.    str r0, [r1]\n\
  10383.    pop {r3}\n\
  10384.    mov r8, r3\n\
  10385.    pop {r4-r7}\n\
  10386.    pop {r0}\n\
  10387.    bx r0\n\
  10388.    .align 2, 0\n\
  10389. _0802418C: .4byte gBattleTextBuff1\n\
  10390. _08024190: .4byte gBattlescriptCurrInstr\n\
  10391.        .syntax divided");
  10392. }
  10393. #endif //NONMATCHING
  10394.  
  10395. /*
  10396. static u32 GetTrainerMoneyToGive(u16 trainerId)
  10397. {
  10398.     u32 i = 0;
  10399.     u32 lastMonLevel = 0;
  10400.     u32 moneyReward = 0;
  10401.  
  10402.     if (trainerId == SECRET_BASE_OPPONENT)
  10403.     {
  10404.         moneyReward = 20 * eSecretBaseRecord->partyLevels[0] * gBattleStruct->moneyMultiplier;
  10405.     }
  10406.     else
  10407.     {
  10408.         switch (gTrainers[trainerId].partyFlags)
  10409.         {
  10410.         case 0:
  10411.             {
  10412.                 const struct TrainerMonNoItemDefaultMoves *party = gTrainers[trainerId].party.NoItemDefaultMoves;
  10413.                 lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
  10414.             }
  10415.             break;
  10416.         case F_TRAINER_PARTY_CUSTOM_MOVESET:
  10417.             {
  10418.                 const struct TrainerMonNoItemCustomMoves *party = gTrainers[trainerId].party.NoItemCustomMoves;
  10419.                 lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
  10420.             }
  10421.             break;
  10422.         case F_TRAINER_PARTY_HELD_ITEM:
  10423.             {
  10424.                 const struct TrainerMonItemDefaultMoves *party = gTrainers[trainerId].party.ItemDefaultMoves;
  10425.                 lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
  10426.             }
  10427.             break;
  10428.         case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:
  10429.             {
  10430.                 const struct TrainerMonItemCustomMoves *party = gTrainers[trainerId].party.ItemCustomMoves;
  10431.                 lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
  10432.             }
  10433.             break;
  10434.         }
  10435.  
  10436.         for (; gTrainerMoneyTable[i].classId != 0xFF; i++)
  10437.         {
  10438.             if (gTrainerMoneyTable[i].classId == gTrainers[trainerId].trainerClass)
  10439.                 break;
  10440.         }
  10441.  
  10442.         if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  10443.             moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * 2 * gTrainerMoneyTable[i].value;
  10444.         else
  10445.             moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * gTrainerMoneyTable[i].value;
  10446.     }
  10447.  
  10448.     return moneyReward;
  10449. }
  10450.  
  10451. static void atk5D_getmoneyreward(void)
  10452. {
  10453.     u32 moneyReward = GetTrainerMoneyToGive(gTrainerBattleOpponent_A);
  10454.     if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
  10455.         moneyReward += GetTrainerMoneyToGive(gTrainerBattleOpponent_B);
  10456.  
  10457.     AddMoney(&gSaveBlock1Ptr->money, moneyReward);
  10458.  
  10459.     PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff1, 5, moneyReward)
  10460.  
  10461.     gBattlescriptCurrInstr++;
  10462. }
  10463. */
  10464.  
  10465. static void atk5E_8025A70(void)
  10466. {
  10467.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  10468.     switch (gBattleCommunication[0])
  10469.     {
  10470.     case 0:
  10471.         EmitGetAttributes(0, REQUEST_ALL_BATTLE, 0);
  10472.         MarkBufferBankForExecution(gActiveBattler);
  10473.         gBattleCommunication[0]++;
  10474.         break;
  10475.     case 1:
  10476.          if (gBattleExecBuffer == 0)
  10477.          {
  10478.             int i;
  10479.             struct BattlePokemon* bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4];
  10480.             for (i = 0; i < 4; i++)
  10481.             {
  10482.                 gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i];
  10483.                 gBattleMons[gActiveBattler].pp[i] = bufferPoke->pp[i];
  10484.             }
  10485.             gBattlescriptCurrInstr += 2;
  10486.          }
  10487.          break;
  10488.     }
  10489. }
  10490.  
  10491. static void atk5F_8025B24(void)
  10492. {
  10493.     gActiveBattler = gBankAttacker;
  10494.     gBankAttacker = gBankTarget;
  10495.     gBankTarget = gActiveBattler;
  10496.     //what is xor...
  10497.     if (gHitMarker & HITMARKER_PURSUIT_TRAP)
  10498.         gHitMarker &= ~(HITMARKER_PURSUIT_TRAP);
  10499.     else
  10500.         gHitMarker |= HITMARKER_PURSUIT_TRAP;
  10501.     gBattlescriptCurrInstr++;
  10502. }
  10503.  
  10504. static void atk60_incrementgamestat(void)
  10505. {
  10506.     if (GetBattlerSide(gBankAttacker) == 0)
  10507.     {
  10508.         IncrementGameStat(T2_READ_8(gBattlescriptCurrInstr + 1));
  10509.     }
  10510.     gBattlescriptCurrInstr += 2;
  10511. }
  10512.  
  10513. static void atk61_drawpartystatussummary(void)
  10514. {
  10515.     int i;
  10516.     struct Pokemon* party;
  10517.     struct HpAndStatus hpStatus[6];
  10518.     if (gBattleExecBuffer)
  10519.         return;
  10520.  
  10521.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  10522.     if (GetBattlerSide(gActiveBattler) == 0)
  10523.         party = gPlayerParty;
  10524.     else
  10525.         party = gEnemyParty;
  10526.  
  10527.     for (i = 0; i < 6; i++)
  10528.     {
  10529.         if (GetMonData(&party[i], MON_DATA_SPECIES2) == 0 || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
  10530.         {
  10531.             hpStatus[i].hp = 0xFFFF;
  10532.             hpStatus[i].status = 0;
  10533.         }
  10534.         else
  10535.         {
  10536.             hpStatus[i].hp = GetMonData(&party[i], MON_DATA_HP);
  10537.             hpStatus[i].status = GetMonData(&party[i], MON_DATA_STATUS);
  10538.         }
  10539.     }
  10540.     EmitDrawPartyStatusSummary(0, hpStatus, 1);
  10541.     MarkBufferBankForExecution(gActiveBattler);
  10542.     gBattlescriptCurrInstr += 2;
  10543. }
  10544.  
  10545. static void atk62_08025C6C(void)
  10546. {
  10547.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  10548.     Emitcmd49(0);
  10549.     MarkBufferBankForExecution(gActiveBattler);
  10550.     gBattlescriptCurrInstr += 2;
  10551. }
  10552.  
  10553. static void atk63_jumptorandomattack(void)
  10554. {
  10555.     if (T2_READ_8(gBattlescriptCurrInstr + 1))
  10556.         gCurrentMove = gRandomMove;
  10557.     else
  10558.         gChosenMove = gCurrentMove = gRandomMove;
  10559.     gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
  10560. }
  10561.  
  10562. static void atk64_statusanimation(void)
  10563. {
  10564.     if (gBattleExecBuffer == 0)
  10565.     {
  10566.         gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  10567.         if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS))
  10568.         {
  10569.             EmitStatusAnimation(0, 0, gBattleMons[gActiveBattler].status1);
  10570.             MarkBufferBankForExecution(gActiveBattler);
  10571.         }
  10572.         gBattlescriptCurrInstr += 2;
  10573.     }
  10574. }
  10575.  
  10576. static void atk65_status2animation(void)
  10577. {
  10578.     if (gBattleExecBuffer == 0)
  10579.     {
  10580.         u32 possible_to_anim;
  10581.         gActiveBattler = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1));
  10582.         possible_to_anim = T1_READ_32(gBattlescriptCurrInstr + 2);
  10583.         if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS))
  10584.         {
  10585.             EmitStatusAnimation(0, 1, gBattleMons[gActiveBattler].status2 & possible_to_anim);
  10586.             MarkBufferBankForExecution(gActiveBattler);
  10587.         }
  10588.         gBattlescriptCurrInstr += 6;
  10589.     }
  10590. }
  10591.  
  10592. static void atk66_chosenstatusanimation(void)
  10593. {
  10594.     if (gBattleExecBuffer == 0)
  10595.     {
  10596.         u32 status;
  10597.         gActiveBattler = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1));
  10598.         status = T1_READ_32(gBattlescriptCurrInstr + 3);
  10599.         if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS))
  10600.         {
  10601.             EmitStatusAnimation(0, T1_READ_8(gBattlescriptCurrInstr + 2), status);
  10602.             MarkBufferBankForExecution(gActiveBattler);
  10603.         }
  10604.         gBattlescriptCurrInstr += 7;
  10605.     }
  10606. }
  10607.  
  10608. static void atk67_yesnobox(void)
  10609. {
  10610.     switch (gBattleCommunication[0])
  10611.     {
  10612.     case 0:
  10613.         sub_8023A80();
  10614.         gBattleCommunication[0]++;
  10615.         gBattleCommunication[1] = 0;
  10616.         sub_802BC6C();
  10617.         break;
  10618.     case 1:
  10619.         if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0)
  10620.         {
  10621.             PlaySE(SE_SELECT);
  10622.             nullsub_6();
  10623.             gBattleCommunication[1] = 0;
  10624.             sub_802BC6C();
  10625.         }
  10626.         if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0)
  10627.         {
  10628.             PlaySE(SE_SELECT);
  10629.             nullsub_6();
  10630.             gBattleCommunication[1] = 1;
  10631.             sub_802BC6C();
  10632.         }
  10633.         if (gMain.newKeys & B_BUTTON)
  10634.         {
  10635.             gBattleCommunication[1] = 1;
  10636.             PlaySE(SE_SELECT);
  10637.             sub_8023AD8();
  10638.             gBattlescriptCurrInstr++;
  10639.         }
  10640.         else if (gMain.newKeys & A_BUTTON)
  10641.         {
  10642.             PlaySE(SE_SELECT);
  10643.             sub_8023AD8();
  10644.             gBattlescriptCurrInstr++;
  10645.         }
  10646.         break;
  10647.     }
  10648. }
  10649.  
  10650. static void atk68_cancelallactions(void)
  10651. {
  10652.     int i;
  10653.     for (i = 0; i < gBattlersCount; i++)
  10654.     {
  10655.         gActionsByTurnOrder[i] = 0xC;
  10656.     }
  10657.     gBattlescriptCurrInstr++;
  10658. }
  10659.  
  10660. static void atk69_adjustsetdamage(void) //literally a copy of atk07 except theres no rand dmg modifier...
  10661. {
  10662.     u8 hold_effect, quality;
  10663.     if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
  10664.         hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam;
  10665.     else
  10666.     {
  10667.         hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
  10668.         quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
  10669.     }
  10670.  
  10671.     gStringBank = gBankTarget;
  10672.  
  10673.     if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality)
  10674.     {
  10675.         RecordItemBattle(gBankTarget, hold_effect);
  10676.         gSpecialStatuses[gBankTarget].focusBanded = 1;
  10677.     }
  10678.     if (hold_effect == HOLD_EFFECT_FOCUS_SASH)
  10679.     {
  10680.         RecordItemBattle(gBankTarget, hold_effect);
  10681.         gSpecialStatuses[gBankTarget].focusBanded = 1;
  10682.     }
  10683.     if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)
  10684.         goto END;
  10685.     if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured
  10686.      && !gSpecialStatuses[gBankTarget].focusBanded)
  10687.         goto END;
  10688.     if (gBattleMons[gBankTarget].hp > gBattleMoveDamage)
  10689.         goto END;
  10690.  
  10691.     gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1;
  10692.  
  10693.     if (gProtectStructs[gBankTarget].endured)
  10694.     {
  10695.         gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;
  10696.         goto END;
  10697.     }
  10698.     if (gSpecialStatuses[gBankTarget].focusBanded)
  10699.     {
  10700.         gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;
  10701.         gLastUsedItem = gBattleMons[gBankTarget].item;
  10702.     }
  10703.  
  10704.     END:
  10705.         gBattlescriptCurrInstr++;
  10706. }
  10707.  
  10708. void atk6A_removeitem(void)
  10709. {
  10710.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  10711.     USED_HELD_ITEMS(gActiveBattler) = gBattleMons[gActiveBattler].item;
  10712.  
  10713.     gBattleMons[gActiveBattler].item = 0;
  10714.     EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item);
  10715.     MarkBufferBankForExecution(gActiveBattler);
  10716.     gBattlescriptCurrInstr += 2;
  10717. }
  10718.  
  10719. static void atk6B_atknameinbuff1(void)
  10720. {
  10721.     gBattleTextBuff1[0] = 0xFD;
  10722.     gBattleTextBuff1[1] = 7;
  10723.     gBattleTextBuff1[2] = gBankAttacker;
  10724.     gBattleTextBuff1[3] = gBattlerPartyIndexes[gBankAttacker];
  10725.     gBattleTextBuff1[4] = 0xFF;
  10726.     gBattlescriptCurrInstr++;
  10727. }
  10728.  
  10729. #ifdef NONMATCHING
  10730. static void atk6C_drawlvlupbox(void)
  10731. {
  10732.     u8 r1 = 0;
  10733.     u8 r7 = 0;
  10734.     switch (gBattleStruct->atk6C_statetracker)
  10735.     {
  10736.     case 0:
  10737.         sub_802BBD4(0xB, 0, 0x1D, 0x7, r1);
  10738.         StringCopy(gStringVar4, BattleText_Format2);
  10739.  
  10740.     }
  10741. }
  10742.  
  10743. #else
  10744. NAKED
  10745. static void atk6C_drawlvlupbox(void)
  10746. {
  10747.     asm(".syntax unified\n\
  10748.    push {r4-r7,lr}\n\
  10749.    mov r7, r10\n\
  10750.    mov r6, r9\n\
  10751.    mov r5, r8\n\
  10752.    push {r5-r7}\n\
  10753.    sub sp, 0x4\n\
  10754.    movs r1, 0\n\
  10755.    movs r7, 0\n\
  10756.    ldr r0, _08024928 @ =gSharedMem\n\
  10757.    mov r10, r0\n\
  10758.    ldr r4, _0802492C @ =0x0001609c\n\
  10759.    add r4, r10\n\
  10760.    ldrb r0, [r4]\n\
  10761.    cmp r0, 0x1\n\
  10762.    bne _0802491C\n\
  10763.    b _08024AF4\n\
  10764. _0802491C:\n\
  10765.    cmp r0, 0x1\n\
  10766.    bgt _08024930\n\
  10767.    cmp r0, 0\n\
  10768.    beq _0802493E\n\
  10769.    b _08024C38\n\
  10770.    .align 2, 0\n\
  10771. _08024928: .4byte gSharedMem\n\
  10772. _0802492C: .4byte 0x0001609c\n\
  10773. _08024930:\n\
  10774.    cmp r0, 0x2\n\
  10775.    bne _08024936\n\
  10776.    b _08024C04\n\
  10777. _08024936:\n\
  10778.    cmp r0, 0x3\n\
  10779.    bne _0802493C\n\
  10780.    b _08024C30\n\
  10781. _0802493C:\n\
  10782.    b _08024C38\n\
  10783. _0802493E:\n\
  10784.    str r1, [sp]\n\
  10785.    movs r0, 0xB\n\
  10786.    movs r1, 0\n\
  10787.    movs r2, 0x1D\n\
  10788.    movs r3, 0x7\n\
  10789.    bl sub_802BBD4\n\
  10790.    ldr r0, _0802499C @ =gStringVar4\n\
  10791.    ldr r1, _080249A0 @ =BattleText_Format2\n\
  10792.    bl StringCopy\n\
  10793.    adds r5, r0, 0\n\
  10794.    movs r1, 0\n\
  10795.    mov r8, r1\n\
  10796. _0802495A:\n\
  10797.    movs r2, 0\n\
  10798.    mov r9, r2\n\
  10799.    ldr r0, _080249A4 @ =gUnknown_0840165C\n\
  10800.    mov r1, r8\n\
  10801.    lsls r4, r1, 2\n\
  10802.    adds r0, r4, r0\n\
  10803.    ldr r1, [r0]\n\
  10804.    adds r0, r5, 0\n\
  10805.    bl StringAppend\n\
  10806.    adds r5, r0, 0\n\
  10807.    ldr r0, _080249A8 @ =gSharedMem\n\
  10808.    ldr r2, _080249AC @ =0x00016018\n\
  10809.    adds r0, r2\n\
  10810.    ldrb r1, [r0]\n\
  10811.    movs r0, 0x64\n\
  10812.    muls r0, r1\n\
  10813.    ldr r1, _080249B0 @ =gPlayerParty\n\
  10814.    adds r0, r1\n\
  10815.    ldr r1, _080249B4 @ =gLevelUpStatBoxStats\n\
  10816.    add r1, r8\n\
  10817.    ldrb r1, [r1]\n\
  10818.    bl GetMonData\n\
  10819.    lsls r0, 16\n\
  10820.    lsrs r1, r0, 16\n\
  10821.    mov r0, r8\n\
  10822.    cmp r0, 0x5\n\
  10823.    bhi _08024A1A\n\
  10824.    ldr r0, _080249B8 @ =_080249BC\n\
  10825.    adds r0, r4, r0\n\
  10826.    ldr r0, [r0]\n\
  10827.    mov pc, r0\n\
  10828.    .align 2, 0\n\
  10829. _0802499C: .4byte gStringVar4\n\
  10830. _080249A0: .4byte BattleText_Format2\n\
  10831. _080249A4: .4byte gUnknown_0840165C\n\
  10832. _080249A8: .4byte gSharedMem\n\
  10833. _080249AC: .4byte 0x00016018\n\
  10834. _080249B0: .4byte gPlayerParty\n\
  10835. _080249B4: .4byte gLevelUpStatBoxStats\n\
  10836. _080249B8: .4byte _080249BC\n\
  10837.    .align 2, 0\n\
  10838. _080249BC:\n\
  10839.    .4byte _080249D4\n\
  10840.    .4byte _080249E0\n\
  10841.    .4byte _080249EC\n\
  10842.    .4byte _080249F8\n\
  10843.    .4byte _08024A04\n\
  10844.    .4byte _08024A10\n\
  10845. _080249D4:\n\
  10846.    ldr r0, _080249DC @ =gSharedMem + 0x17180\n\
  10847.    ldrh r0, [r0]\n\
  10848.    b _08024A14\n\
  10849.    .align 2, 0\n\
  10850. _080249DC: .4byte gSharedMem + 0x17180\n\
  10851. _080249E0:\n\
  10852.    ldr r0, _080249E8 @ =gSharedMem + 0x17180\n\
  10853.    ldrh r0, [r0, 0x8]\n\
  10854.    b _08024A14\n\
  10855.    .align 2, 0\n\
  10856. _080249E8: .4byte gSharedMem + 0x17180\n\
  10857. _080249EC:\n\
  10858.    ldr r0, _080249F4 @ =gSharedMem + 0x17180\n\
  10859.    ldrh r0, [r0, 0x2]\n\
  10860.    b _08024A14\n\
  10861.    .align 2, 0\n\
  10862. _080249F4: .4byte gSharedMem + 0x17180\n\
  10863. _080249F8:\n\
  10864.    ldr r0, _08024A00 @ =gSharedMem + 0x17180\n\
  10865.    ldrh r0, [r0, 0xA]\n\
  10866.    b _08024A14\n\
  10867.    .align 2, 0\n\
  10868. _08024A00: .4byte gSharedMem + 0x17180\n\
  10869. _08024A04:\n\
  10870.    ldr r0, _08024A0C @ =gSharedMem + 0x17180\n\
  10871.    ldrh r0, [r0, 0x4]\n\
  10872.    b _08024A14\n\
  10873.    .align 2, 0\n\
  10874. _08024A0C: .4byte gSharedMem + 0x17180\n\
  10875. _08024A10:\n\
  10876.    ldr r0, _08024A54 @ =gSharedMem + 0x17180\n\
  10877.    ldrh r0, [r0, 0x6]\n\
  10878. _08024A14:\n\
  10879.    subs r0, r1, r0\n\
  10880.    lsls r0, 16\n\
  10881.    lsrs r7, r0, 16\n\
  10882. _08024A1A:\n\
  10883.    lsls r0, r7, 16\n\
  10884.    asrs r0, 16\n\
  10885.    cmp r0, 0\n\
  10886.    bge _08024A2C\n\
  10887.    negs r0, r0\n\
  10888.    lsls r0, 16\n\
  10889.    lsrs r7, r0, 16\n\
  10890.    movs r1, 0x1\n\
  10891.    add r9, r1\n\
  10892. _08024A2C:\n\
  10893.    movs r0, 0xFC\n\
  10894.    strb r0, [r5]\n\
  10895.    movs r0, 0x13\n\
  10896.    strb r0, [r5, 0x1]\n\
  10897.    movs r1, 0x1\n\
  10898.    mov r2, r8\n\
  10899.    ands r1, r2\n\
  10900.    lsls r0, r1, 3\n\
  10901.    adds r0, r1\n\
  10902.    adds r0, 0x5\n\
  10903.    lsls r0, 3\n\
  10904.    adds r0, 0x6\n\
  10905.    strb r0, [r5, 0x2]\n\
  10906.    adds r5, 0x3\n\
  10907.    mov r0, r9\n\
  10908.    cmp r0, 0\n\
  10909.    beq _08024A5C\n\
  10910.    ldr r1, _08024A58 @ =BattleText_Dash\n\
  10911.    b _08024A5E\n\
  10912.    .align 2, 0\n\
  10913. _08024A54: .4byte gSharedMem + 0x17180\n\
  10914. _08024A58: .4byte BattleText_Dash\n\
  10915. _08024A5C:\n\
  10916.    ldr r1, _08024AA4 @ =BattleText_Plus\n\
  10917. _08024A5E:\n\
  10918.    adds r0, r5, 0\n\
  10919.    bl StringCopy\n\
  10920.    adds r5, r0, 0\n\
  10921.    movs r6, 0xFC\n\
  10922.    strb r6, [r5]\n\
  10923.    movs r4, 0x14\n\
  10924.    strb r4, [r5, 0x1]\n\
  10925.    movs r0, 0x6\n\
  10926.    strb r0, [r5, 0x2]\n\
  10927.    adds r5, 0x3\n\
  10928.    lsls r1, r7, 16\n\
  10929.    asrs r1, 16\n\
  10930.    adds r0, r5, 0\n\
  10931.    movs r2, 0x1\n\
  10932.    movs r3, 0x2\n\
  10933.    bl ConvertIntToDecimalStringN\n\
  10934.    adds r5, r0, 0\n\
  10935.    strb r6, [r5]\n\
  10936.    strb r4, [r5, 0x1]\n\
  10937.    movs r0, 0\n\
  10938.    strb r0, [r5, 0x2]\n\
  10939.    adds r5, 0x3\n\
  10940.    movs r0, 0x1\n\
  10941.    mov r1, r8\n\
  10942.    ands r0, r1\n\
  10943.    cmp r0, 0\n\
  10944.    beq _08024AA8\n\
  10945.    movs r0, 0xFE\n\
  10946.    strb r0, [r5]\n\
  10947.    movs r0, 0xFF\n\
  10948.    strb r0, [r5, 0x1]\n\
  10949.    adds r5, 0x1\n\
  10950.    b _08024AB8\n\
  10951.    .align 2, 0\n\
  10952. _08024AA4: .4byte BattleText_Plus\n\
  10953. _08024AA8:\n\
  10954.    strb r6, [r5]\n\
  10955.    movs r0, 0x11\n\
  10956.    strb r0, [r5, 0x1]\n\
  10957.    movs r0, 0x8\n\
  10958.    strb r0, [r5, 0x2]\n\
  10959.    adds r5, 0x3\n\
  10960.    movs r0, 0xFF\n\
  10961.    strb r0, [r5]\n\
  10962. _08024AB8:\n\
  10963.    movs r2, 0x1\n\
  10964.    add r8, r2\n\
  10965.    mov r0, r8\n\
  10966.    cmp r0, 0x5\n\
  10967.    bgt _08024AC4\n\
  10968.    b _0802495A\n\
  10969. _08024AC4:\n\
  10970.    ldr r4, _08024AE4 @ =gUnknown_03004210\n\
  10971.    ldr r1, _08024AE8 @ =gStringVar4\n\
  10972.    adds r2, 0xFF\n\
  10973.    movs r0, 0x1\n\
  10974.    str r0, [sp]\n\
  10975.    adds r0, r4, 0\n\
  10976.    movs r3, 0xC\n\
  10977.    bl Text_InitWindow\n\
  10978.    adds r0, r4, 0\n\
  10979.    bl Text_PrintWindow8002F44\n\
  10980.    ldr r1, _08024AEC @ =gSharedMem\n\
  10981.    ldr r2, _08024AF0 @ =0x0001609c\n\
  10982.    adds r1, r2\n\
  10983.    b _08024BEA\n\
  10984.    .align 2, 0\n\
  10985. _08024AE4: .4byte gUnknown_03004210\n\
  10986. _08024AE8: .4byte gStringVar4\n\
  10987. _08024AEC: .4byte gSharedMem\n\
  10988. _08024AF0: .4byte 0x0001609c\n\
  10989. _08024AF4:\n\
  10990.    ldr r0, _08024B94 @ =gMain\n\
  10991.    ldrh r0, [r0, 0x2E]\n\
  10992.    cmp r0, 0\n\
  10993.    bne _08024AFE\n\
  10994.    b _08024C38\n\
  10995. _08024AFE:\n\
  10996.    movs r0, 0x5\n\
  10997.    bl PlaySE\n\
  10998.    ldr r0, _08024B98 @ =gStringVar4\n\
  10999.    ldr r1, _08024B9C @ =BattleText_Format2\n\
  11000.    bl StringCopy\n\
  11001.    adds r5, r0, 0\n\
  11002.    movs r0, 0\n\
  11003.    mov r8, r0\n\
  11004.    mov r9, r0\n\
  11005.    movs r6, 0xFC\n\
  11006.    movs r7, 0x14\n\
  11007.    ldr r1, _08024BA0 @ =0x00016018\n\
  11008.    add r10, r1\n\
  11009. _08024B1C:\n\
  11010.    ldr r1, _08024BA4 @ =gUnknown_0840165C\n\
  11011.    mov r2, r8\n\
  11012.    lsls r0, r2, 2\n\
  11013.    adds r0, r1\n\
  11014.    ldr r1, [r0]\n\
  11015.    adds r0, r5, 0\n\
  11016.    bl StringAppend\n\
  11017.    adds r5, r0, 0\n\
  11018.    mov r0, r10\n\
  11019.    ldrb r1, [r0]\n\
  11020.    movs r0, 0x64\n\
  11021.    muls r0, r1\n\
  11022.    ldr r1, _08024BA8 @ =gPlayerParty\n\
  11023.    adds r0, r1\n\
  11024.    ldr r1, _08024BAC @ =gLevelUpStatBoxStats\n\
  11025.    add r1, r8\n\
  11026.    ldrb r1, [r1]\n\
  11027.    bl GetMonData\n\
  11028.    adds r1, r0, 0\n\
  11029.    strb r6, [r5]\n\
  11030.    movs r0, 0x13\n\
  11031.    strb r0, [r5, 0x1]\n\
  11032.    movs r4, 0x1\n\
  11033.    mov r2, r8\n\
  11034.    ands r4, r2\n\
  11035.    lsls r0, r4, 3\n\
  11036.    adds r0, r4\n\
  11037.    adds r0, 0x5\n\
  11038.    lsls r0, 3\n\
  11039.    adds r0, 0x6\n\
  11040.    strb r0, [r5, 0x2]\n\
  11041.    adds r5, 0x3\n\
  11042.    strb r6, [r5]\n\
  11043.    strb r7, [r5, 0x1]\n\
  11044.    movs r0, 0x6\n\
  11045.    strb r0, [r5, 0x2]\n\
  11046.    adds r5, 0x3\n\
  11047.    lsls r1, 16\n\
  11048.    asrs r1, 16\n\
  11049.    adds r0, r5, 0\n\
  11050.    movs r2, 0x1\n\
  11051.    movs r3, 0x3\n\
  11052.    bl ConvertIntToDecimalStringN\n\
  11053.    adds r5, r0, 0\n\
  11054.    strb r6, [r5]\n\
  11055.    strb r7, [r5, 0x1]\n\
  11056.    mov r0, r9\n\
  11057.    strb r0, [r5, 0x2]\n\
  11058.    adds r5, 0x3\n\
  11059.    cmp r4, 0\n\
  11060.    beq _08024BB0\n\
  11061.    movs r0, 0xFE\n\
  11062.    strb r0, [r5]\n\
  11063.    movs r0, 0xFF\n\
  11064.    strb r0, [r5, 0x1]\n\
  11065.    adds r5, 0x1\n\
  11066.    b _08024BC0\n\
  11067.    .align 2, 0\n\
  11068. _08024B94: .4byte gMain\n\
  11069. _08024B98: .4byte gStringVar4\n\
  11070. _08024B9C: .4byte BattleText_Format2\n\
  11071. _08024BA0: .4byte 0x00016018\n\
  11072. _08024BA4: .4byte gUnknown_0840165C\n\
  11073. _08024BA8: .4byte gPlayerParty\n\
  11074. _08024BAC: .4byte gLevelUpStatBoxStats\n\
  11075. _08024BB0:\n\
  11076.    strb r6, [r5]\n\
  11077.    movs r0, 0x11\n\
  11078.    strb r0, [r5, 0x1]\n\
  11079.    movs r0, 0x8\n\
  11080.    strb r0, [r5, 0x2]\n\
  11081.    adds r5, 0x3\n\
  11082.    movs r0, 0xFF\n\
  11083.    strb r0, [r5]\n\
  11084. _08024BC0:\n\
  11085.    movs r1, 0x1\n\
  11086.    add r8, r1\n\
  11087.    mov r2, r8\n\
  11088.    cmp r2, 0x5\n\
  11089.    ble _08024B1C\n\
  11090.    ldr r4, _08024BF4 @ =gUnknown_03004210\n\
  11091.    ldr r1, _08024BF8 @ =gStringVar4\n\
  11092.    movs r2, 0x80\n\
  11093.    lsls r2, 1\n\
  11094.    movs r0, 0x1\n\
  11095.    str r0, [sp]\n\
  11096.    adds r0, r4, 0\n\
  11097.    movs r3, 0xC\n\
  11098.    bl Text_InitWindow\n\
  11099.    adds r0, r4, 0\n\
  11100.    bl Text_PrintWindow8002F44\n\
  11101.    ldr r1, _08024BFC @ =gSharedMem\n\
  11102.    ldr r0, _08024C00 @ =0x0001609c\n\
  11103.    adds r1, r0\n\
  11104. _08024BEA:\n\
  11105.    ldrb r0, [r1]\n\
  11106.    adds r0, 0x1\n\
  11107.    strb r0, [r1]\n\
  11108.    b _08024C38\n\
  11109.    .align 2, 0\n\
  11110. _08024BF4: .4byte gUnknown_03004210\n\
  11111. _08024BF8: .4byte gStringVar4\n\
  11112. _08024BFC: .4byte gSharedMem\n\
  11113. _08024C00: .4byte 0x0001609c\n\
  11114. _08024C04:\n\
  11115.    ldr r0, _08024C2C @ =gMain\n\
  11116.    ldrh r0, [r0, 0x2E]\n\
  11117.    cmp r0, 0\n\
  11118.    beq _08024C38\n\
  11119.    movs r0, 0x5\n\
  11120.    bl PlaySE\n\
  11121.    movs r0, 0x1\n\
  11122.    str r0, [sp]\n\
  11123.    movs r0, 0xB\n\
  11124.    movs r1, 0\n\
  11125.    movs r2, 0x1D\n\
  11126.    movs r3, 0x7\n\
  11127.    bl sub_802BBD4\n\
  11128.    ldrb r0, [r4]\n\
  11129.    adds r0, 0x1\n\
  11130.    strb r0, [r4]\n\
  11131.    b _08024C38\n\
  11132.    .align 2, 0\n\
  11133. _08024C2C: .4byte gMain\n\
  11134. _08024C30:\n\
  11135.    ldr r1, _08024C48 @ =gBattlescriptCurrInstr\n\
  11136.    ldr r0, [r1]\n\
  11137.    adds r0, 0x1\n\
  11138.    str r0, [r1]\n\
  11139. _08024C38:\n\
  11140.    add sp, 0x4\n\
  11141.    pop {r3-r5}\n\
  11142.    mov r8, r3\n\
  11143.    mov r9, r4\n\
  11144.    mov r10, r5\n\
  11145.    pop {r4-r7}\n\
  11146.    pop {r0}\n\
  11147.    bx r0\n\
  11148.    .align 2, 0\n\
  11149. _08024C48: .4byte gBattlescriptCurrInstr\n\
  11150.        .syntax divided");
  11151. }
  11152.  
  11153. #endif
  11154.  
  11155. static void atk6D_resetsentmonsvalue(void)
  11156. {
  11157.     ResetSentPokesToOpponentValue();
  11158.     gBattlescriptCurrInstr++;
  11159. }
  11160.  
  11161. static void atk6E_setatktoplayer0(void)
  11162. {
  11163.     gBankAttacker = GetBattlerAtPosition(0);
  11164.     gBattlescriptCurrInstr++;
  11165. }
  11166.  
  11167. static void atk6F_makevisible(void)
  11168. {
  11169.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  11170.     EmitSpriteInvisibility(0, 0);
  11171.     MarkBufferBankForExecution(gActiveBattler);
  11172.     gBattlescriptCurrInstr += 2;
  11173. }
  11174.  
  11175. static void atk70_recordlastability(void)
  11176. {
  11177.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  11178.     RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
  11179.     gBattlescriptCurrInstr += 1; //buggy, should be += 2, one byte for command, one byte for argument...
  11180. }
  11181.  
  11182. void sub_8024CEC(void)
  11183. {
  11184.     gBattleTextBuff2[0] = 0xFD;
  11185.     gBattleTextBuff2[1] = 2;
  11186.     gBattleTextBuff2[2] = (gMoveToLearn);
  11187.     gBattleTextBuff2[3] = uBYTE1_16(gMoveToLearn);
  11188.     gBattleTextBuff2[4] = 0xFF;
  11189. }
  11190.  
  11191. static void atk71_buffermovetolearn(void)
  11192. {
  11193.     sub_8024CEC();
  11194.     gBattlescriptCurrInstr++;
  11195. }
  11196.  
  11197. static void atk72_jumpifplayerran(void)
  11198. {
  11199.     if (TryRunFromBattle(gBank1))
  11200.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11201.     else
  11202.         gBattlescriptCurrInstr += 5;
  11203. }
  11204.  
  11205. static void atk73_hpthresholds(void)
  11206. {
  11207.     u8 opposing_bank;
  11208.     s32 result;
  11209.     if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
  11210.     {
  11211.         gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  11212.         opposing_bank = gActiveBattler ^ 1;
  11213.  
  11214.         result = gBattleMons[opposing_bank].hp * 100 / gBattleMons[opposing_bank].maxHP;
  11215.         if (result == 0)
  11216.             result = 1;
  11217.  
  11218.         if (result >= 70 || !gBattleMons[opposing_bank].hp)
  11219.             gBattleStruct->hpScale = 0;
  11220.         else if (result >= 40)
  11221.             gBattleStruct->hpScale = 1;
  11222.         else if (result >= 10)
  11223.             gBattleStruct->hpScale = 2;
  11224.         else
  11225.             gBattleStruct->hpScale = 3;
  11226.     }
  11227.  
  11228.     gBattlescriptCurrInstr += 2;
  11229. }
  11230.  
  11231. static void atk74_hpthresholds2(void)
  11232. {
  11233.     u8 opposing_bank;
  11234.     u8 hp_switchout;
  11235.     s32 result;
  11236.     if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
  11237.     {
  11238.         gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  11239.         opposing_bank = gActiveBattler ^ 1;
  11240.         hp_switchout = ewram160BCarr(GetBattlerSide(opposing_bank)); //gBattleStruct->HP_OnSwitchout[GetBattlerSide(opposing_bank)];
  11241.         result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout;
  11242.  
  11243.         if (gBattleMons[opposing_bank].hp >= hp_switchout)
  11244.             gBattleStruct->hpScale = 0;
  11245.         else if (result <= 29)
  11246.             gBattleStruct->hpScale = 1;
  11247.         else if (result <= 69)
  11248.             gBattleStruct->hpScale = 2;
  11249.         else
  11250.             gBattleStruct->hpScale = 3;
  11251.     }
  11252.  
  11253.     gBattlescriptCurrInstr += 2;
  11254. }
  11255.  
  11256. static void atk75_useitemonopponent(void)
  11257. {
  11258.     gBankInMenu = gBankAttacker;
  11259.     PokemonUseItemEffects(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker]], gLastUsedItem, gBattlerPartyIndexes[gBankAttacker], 0, 1);
  11260.     gBattlescriptCurrInstr += 1;
  11261. }
  11262.  
  11263. static void atk76_various(void)
  11264. {
  11265.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  11266.     switch (T2_READ_8(gBattlescriptCurrInstr + 2))
  11267.     {
  11268.     case 0:
  11269.         CancelMultiTurnMoves(gActiveBattler);
  11270.         break;
  11271.     case 1:
  11272.         {
  11273.             u8 side;
  11274.             gBankAttacker = gBankTarget;
  11275.             side = GetBattlerSide(gBankAttacker) ^ 1;
  11276.             if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp)
  11277.                 gBankTarget = gSideTimers[side].followmeTarget;
  11278.             else
  11279.                 gBankTarget = gActiveBattler;
  11280.         }
  11281.         break;
  11282.     case 2:
  11283.         gBattleCommunication[0] = CanRunFromBattle();
  11284.         break;
  11285.     case 3:
  11286.         gBankTarget = GetMoveTarget(gCurrentMove, 0);
  11287.         break;
  11288.     case 4:
  11289.         if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))
  11290.             gBattleCommunication[0] = 1;
  11291.         else
  11292.             gBattleCommunication[0] = 0;
  11293.         break;
  11294.     case 5:
  11295.         gSpecialStatuses[gActiveBattler].intimidatedPoke = 0;
  11296.         gSpecialStatuses[gActiveBattler].traced = 0;
  11297.         break;
  11298.     case 6:
  11299.         {
  11300.             int i;
  11301.             u16* choiced_move;
  11302.             if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID)
  11303.                 goto ACTIVE_0;
  11304.             if (gBattlerPartyIndexes[2] != gBattleStruct->expGetterID)
  11305.                 break;
  11306.             if (gBattlerPartyIndexes[0] == gBattlerPartyIndexes[2])
  11307.             {
  11308.                 ACTIVE_0:
  11309.                     gActiveBattler = 0;
  11310.             }
  11311.             else
  11312.                 gActiveBattler = 2;
  11313.  
  11314.             choiced_move = CHOICED_MOVE(gActiveBattler);
  11315.             for (i = 0; i < 4; i++)
  11316.             {
  11317.                 if (gBattleMons[gActiveBattler].moves[i] == *choiced_move)
  11318.                     break;
  11319.             }
  11320.             if (i == 4)
  11321.                 *choiced_move = 0;
  11322.         }
  11323.         break;
  11324.     }
  11325.  
  11326.     gBattlescriptCurrInstr += 3;
  11327. }
  11328.  
  11329. static void atk77_setprotectlike(void) //protect and endure
  11330. {
  11331.     bool8 not_last_turn = 1;
  11332.     u16 last_move = gUnknown_02024C4C[gBankAttacker];
  11333.  
  11334.     if (last_move != MOVE_PROTECT && last_move != MOVE_DETECT && last_move != MOVE_ENDURE)
  11335.         gDisableStructs[gBankAttacker].protectUses = 0;
  11336.     if (gCurrentTurnActionNumber == (gBattlersCount - 1))
  11337.         not_last_turn = 0;
  11338.  
  11339.     if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] > Random() && not_last_turn)
  11340.     {
  11341.         if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT)
  11342.         {
  11343.             gProtectStructs[gBankAttacker].protected = 1;
  11344.             gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  11345.         }
  11346.         if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) //what is else if
  11347.         {
  11348.             gProtectStructs[gBankAttacker].endured = 1;
  11349.             gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  11350.         }
  11351.         gDisableStructs[gBankAttacker].protectUses++;
  11352.     }
  11353.     else
  11354.     {
  11355.         gDisableStructs[gBankAttacker].protectUses = 0;
  11356.         gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  11357.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  11358.     }
  11359.  
  11360.     gBattlescriptCurrInstr++;
  11361. }
  11362.  
  11363. static void atk78_faintifabilitynotdamp(void)
  11364. {
  11365.     if (gBattleExecBuffer)
  11366.         return;
  11367.  
  11368.     for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++)
  11369.     {
  11370.         if (gBattleMons[gBankTarget].ability == ABILITY_DAMP)
  11371.             break;
  11372.     }
  11373.  
  11374.     if (gBankTarget == gBattlersCount)
  11375.     {
  11376.         gActiveBattler = gBankAttacker;
  11377.         gBattleMoveDamage = gBattleMons[gActiveBattler].hp;
  11378.         EmitHealthBarUpdate(0, 0x7FFF);
  11379.         MarkBufferBankForExecution(gActiveBattler);
  11380.         gBattlescriptCurrInstr++;
  11381.  
  11382.         for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++)
  11383.         {
  11384.             if (gBankTarget == gBankAttacker)
  11385.                 continue;
  11386.             if (!(gAbsentBattlerFlags & gBitTable[gBankTarget]))
  11387.                 break;
  11388.         }
  11389.     }
  11390.     else
  11391.     {
  11392.         gLastUsedAbility = ABILITY_DAMP;
  11393.         RecordAbilityBattle(gBankTarget, gBattleMons[gBankTarget].ability);
  11394.         gBattlescriptCurrInstr = BattleScript_DampStopsExplosion;
  11395.     }
  11396. }
  11397.  
  11398. static void atk79_setatkhptozero(void)
  11399. {
  11400.     if (gBattleExecBuffer)
  11401.         return;
  11402.  
  11403.     gActiveBattler = gBankAttacker;
  11404.     gBattleMons[gActiveBattler].hp = 0;
  11405.     EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp);
  11406.     MarkBufferBankForExecution(gActiveBattler);
  11407.  
  11408.     gBattlescriptCurrInstr++;
  11409. }
  11410.  
  11411. static void atk7A_jumpifnexttargetvalid(void) //used by intimidate to loop through all targets
  11412. {
  11413.     u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11414.  
  11415.     if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  11416.     {
  11417.         for (gBankTarget++; ; gBankTarget++)
  11418.         {
  11419.             if (gBankTarget == gBankAttacker)
  11420.                 continue;
  11421.             if (!(gAbsentBattlerFlags & gBitTable[gBankTarget]))
  11422.                 break;
  11423.         }
  11424.  
  11425.         if (gBankTarget >= gBattlersCount)
  11426.             gBattlescriptCurrInstr += 5;
  11427.         else
  11428.             gBattlescriptCurrInstr = jump_loc;
  11429.     }
  11430.     else
  11431.         gBattlescriptCurrInstr += 5;
  11432. }
  11433.  
  11434. static void atk7B_tryhealhalfhealth(void)
  11435. {
  11436.     u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11437.  
  11438.     if (T2_READ_8(gBattlescriptCurrInstr + 5) == 1)
  11439.         gBankTarget = gBankAttacker;
  11440.  
  11441.     gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2;
  11442.     if (gBattleMoveDamage == 0)
  11443.         gBattleMoveDamage = 1;
  11444.     gBattleMoveDamage *= -1;
  11445.  
  11446.     if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP)
  11447.         gBattlescriptCurrInstr = fail_loc;
  11448.     else
  11449.         gBattlescriptCurrInstr += 6;
  11450. }
  11451.  
  11452. static void atk7C_trymirrormove(void)
  11453. {
  11454.     u16 r7 = ewram160ACarr2(0, gBankAttacker) | (ewram160ACarr2(1, gBankAttacker) << 8);
  11455.     u16 r6 = ewram16100arr2(0, gBankAttacker) | (ewram16100arr2(1, gBankAttacker) << 8);
  11456.     u16 r5 = ewram16100arr2(2, gBankAttacker) | (ewram16100arr2(3, gBankAttacker) << 8);
  11457.  
  11458.     if (r7 != 0 && r7 != 0xFFFF)
  11459.     {
  11460.         gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  11461.         gCurrentMove = r7;
  11462.         gBankTarget = GetMoveTarget(gCurrentMove, 0);
  11463.         gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
  11464.     }
  11465.     else if (r6 != 0 && r5 != 0 && r6 != 0xFFFF && r5 != 0xFFFF)
  11466.     {
  11467.         gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  11468.         if (Random() & 1)
  11469.             gCurrentMove = r6;
  11470.         else
  11471.             gCurrentMove = r5;
  11472.         gBankTarget = GetMoveTarget(gCurrentMove, 0);
  11473.         gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
  11474.     }
  11475.     else if (r6 != 0 && r6 != 0xFFFF)
  11476.     {
  11477.         gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  11478.         gCurrentMove = r6;
  11479.         gBankTarget = GetMoveTarget(gCurrentMove, 0);
  11480.         gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
  11481.     }
  11482.     else if (r5 != 0 && r5 != 0xFFFF)
  11483.     {
  11484.         gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  11485.         gCurrentMove = r5;
  11486.         gBankTarget = GetMoveTarget(gCurrentMove, 0);
  11487.         gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
  11488.     }
  11489.     else
  11490.     {
  11491.         gSpecialStatuses[gBankAttacker].flag20 = 1;
  11492.         gBattlescriptCurrInstr++;
  11493.     }
  11494. }
  11495.  
  11496. static void atk7D_setrain(void)
  11497. {
  11498.     if (gBattleWeather & WEATHER_RAIN_ANY)
  11499.     {
  11500.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  11501.         gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  11502.     }
  11503.     else
  11504.     {
  11505.         gBattleWeather = WEATHER_RAIN_TEMPORARY;
  11506.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  11507.         gWishFutureKnock.weatherDuration = 5;
  11508.     }
  11509.     gBattlescriptCurrInstr++;
  11510. }
  11511.  
  11512. static void atk7E_setreflect(void)
  11513. {
  11514.     if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_REFLECT)
  11515.     {
  11516.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  11517.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  11518.     }
  11519.     else
  11520.     {
  11521.         gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_REFLECT;
  11522.         gSideTimers[GetBattlerPosition(gBankAttacker) & 1].reflectTimer = 5;
  11523.         if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2)
  11524.             gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  11525.         else
  11526.             gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  11527.     }
  11528.     gBattlescriptCurrInstr++;
  11529. }
  11530.  
  11531. static void atk7F_setseeded(void)
  11532. {
  11533.     if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBankTarget] & STATUS3_LEECHSEED)
  11534.     {
  11535.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  11536.         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  11537.     }
  11538.     else if (gBattleMons[gBankTarget].type1 == TYPE_GRASS || gBattleMons[gBankTarget].type2 == TYPE_GRASS)
  11539.     {
  11540.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  11541.         gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  11542.     }
  11543.     else
  11544.     {
  11545.         gStatuses3[gBankTarget] |= gBankAttacker;
  11546.         gStatuses3[gBankTarget] |= STATUS3_LEECHSEED;
  11547.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  11548.     }
  11549.  
  11550.     gBattlescriptCurrInstr++;
  11551. }
  11552.  
  11553. static void atk80_manipulatedamage(void)
  11554. {
  11555.     switch (T2_READ_8(gBattlescriptCurrInstr + 1))
  11556.     {
  11557.     case 0:
  11558.         gBattleMoveDamage *= -1;
  11559.         break;
  11560.     case 1:
  11561.         gBattleMoveDamage /= 2;
  11562.         if (gBattleMoveDamage == 0)
  11563.             gBattleMoveDamage = 1;
  11564.         if ((gBattleMons[gBankTarget].maxHP / 2) < gBattleMoveDamage)
  11565.             gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2;
  11566.         break;
  11567.     case 2:
  11568.         gBattleMoveDamage *= 2;
  11569.         break;
  11570.     }
  11571.  
  11572.     gBattlescriptCurrInstr += 2;
  11573. }
  11574.  
  11575. static void atk81_trysetrest(void)
  11576. {
  11577.     u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11578.     gActiveBattler = gBankTarget = gBankAttacker;
  11579.     gBattleMoveDamage = gBattleMons[gBankTarget].maxHP * (-1);
  11580.     if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP)
  11581.         gBattlescriptCurrInstr = fail_loc;
  11582.     else
  11583.     {
  11584.         if (gBattleMons[gBankTarget].status1 & ((u8)(~STATUS_SLEEP)))
  11585.             gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  11586.         else
  11587.             gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  11588.  
  11589.         gBattleMons[gBankTarget].status1 = 3;
  11590.         EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
  11591.         MarkBufferBankForExecution(gActiveBattler);
  11592.         gBattlescriptCurrInstr += 5;
  11593.     }
  11594. }
  11595.  
  11596. static void atk82_jumpifnotfirstturn(void)
  11597. {
  11598.     u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11599.  
  11600.     if (gDisableStructs[gBankAttacker].isFirstTurn)
  11601.         gBattlescriptCurrInstr += 5;
  11602.     else
  11603.         gBattlescriptCurrInstr = jump_loc;
  11604. }
  11605.  
  11606. static void atk83_nop(void)
  11607. {
  11608.     gBattlescriptCurrInstr++;
  11609. }
  11610.  
  11611. bool8 UproarWakeUpCheck(u8 bank)
  11612. {
  11613.     int i;
  11614.     for (i = 0; i < gBattlersCount; i++)
  11615.     {
  11616.         if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[bank].ability == ABILITY_SOUNDPROOF) //wtf gamefreak, you should check this only once, not every time in a loop...
  11617.             continue;
  11618.         gBattleStruct->scriptingActive = i;
  11619.         if (gBankTarget == 0xFF)
  11620.             gBankTarget = i;
  11621.         else if (gBankTarget == i)
  11622.             gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  11623.         else
  11624.             gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  11625.         break;
  11626.     }
  11627.     if (i == gBattlersCount)
  11628.         return 0;
  11629.     else
  11630.         return 1;
  11631. }
  11632.  
  11633. static void atk84_jumpifcantmakeasleep(void)
  11634. {
  11635.     u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11636.     if (UproarWakeUpCheck(gBankTarget))
  11637.         gBattlescriptCurrInstr = jump_loc;
  11638.     else if (gBattleMons[gBankTarget].ability == ABILITY_INSOMNIA || gBattleMons[gBankTarget].ability == ABILITY_VITAL_SPIRIT)
  11639.     {
  11640.         gLastUsedAbility = gBattleMons[gBankTarget].ability;
  11641.         gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  11642.         gBattlescriptCurrInstr = jump_loc;
  11643.         RecordAbilityBattle(gBankTarget, gLastUsedAbility);
  11644.     }
  11645.     else
  11646.     {
  11647.         gBattlescriptCurrInstr += 5;
  11648.     }
  11649. }
  11650.  
  11651. static void atk85_stockpile(void)
  11652. {
  11653.     if (gDisableStructs[gBankAttacker].stockpileCounter == 3)
  11654.     {
  11655.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  11656.         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  11657.     }
  11658.     else
  11659.     {
  11660.         gDisableStructs[gBankAttacker].stockpileCounter++;
  11661.         gBattleTextBuff1[0] = 0xFD;
  11662.         gBattleTextBuff1[1] = 1;
  11663.         gBattleTextBuff1[2] = 1;
  11664.         gBattleTextBuff1[3] = 1;
  11665.         gBattleTextBuff1[4] = gDisableStructs[gBankAttacker].stockpileCounter;
  11666.         gBattleTextBuff1[5] = 0xFF;
  11667.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  11668.     }
  11669.     gBattlescriptCurrInstr++;
  11670. }
  11671.  
  11672. static void atk86_stockpiletobasedamage(void)
  11673. {
  11674.     u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11675.     if (gDisableStructs[gBankAttacker].stockpileCounter == 0)
  11676.     {
  11677.         gBattlescriptCurrInstr = jump_loc;
  11678.     }
  11679.     else
  11680.     {
  11681.         if (gBattleCommunication[6] != 1)
  11682.         {
  11683.             gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove,
  11684.                                                     gSideAffecting[GetBattlerPosition(gBankTarget) & 1], 0,
  11685.                                                     0, gBankAttacker, gBankTarget)
  11686.                                 * gDisableStructs[gBankAttacker].stockpileCounter;
  11687.             gBattleStruct->animTurn = gDisableStructs[gBankAttacker].stockpileCounter;
  11688.  
  11689.             if (gProtectStructs[gBankAttacker].helpingHand)
  11690.                 gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
  11691.         }
  11692.         gDisableStructs[gBankAttacker].stockpileCounter = 0;
  11693.         gBattlescriptCurrInstr += 5;
  11694.     }
  11695. }
  11696.  
  11697. static void atk87_stockpiletohpheal(void)
  11698. {
  11699.     u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11700.     if (gDisableStructs[gBankAttacker].stockpileCounter == 0)
  11701.     {
  11702.         gBattlescriptCurrInstr = jump_loc;
  11703.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  11704.     }
  11705.     else if (gBattleMons[gBankAttacker].maxHP == gBattleMons[gBankAttacker].hp)
  11706.     {
  11707.         gDisableStructs[gBankAttacker].stockpileCounter = 0;
  11708.         gBattlescriptCurrInstr = jump_loc;
  11709.         gBankTarget = gBankAttacker;
  11710.         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  11711.     }
  11712.     else
  11713.     {
  11714.         gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / (1 << (3 - gDisableStructs[gBankAttacker].stockpileCounter));
  11715.         if (gBattleMoveDamage == 0)
  11716.             gBattleMoveDamage = 1;
  11717.         gBattleMoveDamage *= -1;
  11718.         gBattleStruct->animTurn = gDisableStructs[gBankAttacker].stockpileCounter;
  11719.         gDisableStructs[gBankAttacker].stockpileCounter = 0;
  11720.         gBattlescriptCurrInstr += 5;
  11721.         gBankTarget = gBankAttacker;
  11722.     }
  11723. }
  11724.  
  11725. static void atk88_negativedamage(void)
  11726. {
  11727.     gBattleMoveDamage = -(gHpDealt / 2);
  11728.     if (gBattleMoveDamage == 0)
  11729.         gBattleMoveDamage = -1;
  11730.     gBattlescriptCurrInstr++;
  11731. }
  11732.  
  11733. static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr)
  11734. {
  11735.     bool8 certain = FALSE;
  11736.     bool8 notProtectAffected = FALSE;
  11737.     u32 index;
  11738.  
  11739.     if (flags & MOVE_EFFECT_AFFECTS_USER)
  11740.         gActiveBattler = gBankAttacker;
  11741.     else
  11742.         gActiveBattler = gBankTarget;
  11743.  
  11744.     flags &= ~(MOVE_EFFECT_AFFECTS_USER);
  11745.  
  11746.     if (flags & MOVE_EFFECT_CERTAIN)
  11747.         certain++;
  11748.     flags &= ~(MOVE_EFFECT_CERTAIN);
  11749.  
  11750.     if (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED)
  11751.         notProtectAffected++;
  11752.     flags &= ~(STAT_CHANGE_NOT_PROTECT_AFFECTED);
  11753.  
  11754.     PREPARE_STAT_BUFFER(gBattleTextBuff1, statId)
  11755.  
  11756.     if ((statValue << 0x18) < 0) // stat decrease
  11757.     {
  11758.         if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer
  11759.             && !certain && gCurrentMove != MOVE_CURSE)
  11760.         {
  11761.             if (flags == STAT_CHANGE_BS_PTR)
  11762.             {
  11763.                 if (gSpecialStatuses[gActiveBattler].statLowered)
  11764.                 {
  11765.                     gBattlescriptCurrInstr = BS_ptr;
  11766.                 }
  11767.                 else
  11768.                 {
  11769.                     BattleScriptPush(BS_ptr);
  11770.                     gBattleStruct->scriptingActive = gActiveBattler;
  11771.                     gBattlescriptCurrInstr = BattleScript_MistProtected;
  11772.                     gSpecialStatuses[gActiveBattler].statLowered = 1;
  11773.                 }
  11774.             }
  11775.             return STAT_CHANGE_DIDNT_WORK;
  11776.         }
  11777.         else if (gCurrentMove != MOVE_CURSE
  11778.                  && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(0))
  11779.         {
  11780.             gBattlescriptCurrInstr = BattleScript_ButItFailed;
  11781.             return STAT_CHANGE_DIDNT_WORK;
  11782.         }
  11783.         else if ((gBattleMons[gActiveBattler].ability == ABILITY_CLEAR_BODY
  11784.                   || gBattleMons[gActiveBattler].ability == ABILITY_WHITE_SMOKE)
  11785.                  && !certain && gCurrentMove != MOVE_CURSE)
  11786.         {
  11787.             if (flags == STAT_CHANGE_BS_PTR)
  11788.             {
  11789.                 if (gSpecialStatuses[gActiveBattler].statLowered)
  11790.                 {
  11791.                     gBattlescriptCurrInstr = BS_ptr;
  11792.                 }
  11793.                 else
  11794.                 {
  11795.                     BattleScriptPush(BS_ptr);
  11796.                     gBattleStruct->scriptingActive = gActiveBattler;
  11797.                     gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss;
  11798.                     gLastUsedAbility = gBattleMons[gActiveBattler].ability;
  11799.                     RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
  11800.                     gSpecialStatuses[gActiveBattler].statLowered = 1;
  11801.                 }
  11802.             }
  11803.             return STAT_CHANGE_DIDNT_WORK;
  11804.         }
  11805.         else if (gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE
  11806.                  && !certain && statId == STAT_STAGE_ACC)
  11807.         {
  11808.             if (flags == STAT_CHANGE_BS_PTR)
  11809.             {
  11810.                 BattleScriptPush(BS_ptr);
  11811.                 gBattleStruct->scriptingActive = gActiveBattler;
  11812.                 gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;
  11813.                 gLastUsedAbility = gBattleMons[gActiveBattler].ability;
  11814.                 RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
  11815.             }
  11816.             return STAT_CHANGE_DIDNT_WORK;
  11817.         }
  11818.         else if (gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER
  11819.                  && !certain && statId == STAT_STAGE_ATK)
  11820.         {
  11821.             if (flags == STAT_CHANGE_BS_PTR)
  11822.             {
  11823.                 BattleScriptPush(BS_ptr);
  11824.                 gBattleStruct->scriptingActive = gActiveBattler;
  11825.                 gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;
  11826.                 gLastUsedAbility = gBattleMons[gActiveBattler].ability;
  11827.                 RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
  11828.             }
  11829.             return STAT_CHANGE_DIDNT_WORK;
  11830.         }
  11831.         else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && flags == 0)
  11832.         {
  11833.             return STAT_CHANGE_DIDNT_WORK;
  11834.         }
  11835.         else // try to decrease
  11836.         {
  11837.             statValue = -GET_STAT_BUFF_VALUE(statValue);
  11838.             gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN;
  11839.             index = 1;
  11840.             if (statValue == -2)
  11841.             {
  11842.                 gBattleTextBuff2[1] = B_BUFF_STRING;
  11843.                 gBattleTextBuff2[2] = STRINGID_STATHARSHLY;
  11844.                 gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8;
  11845.                 index = 4;
  11846.             }
  11847.             gBattleTextBuff2[index] = B_BUFF_STRING;
  11848.             index++;
  11849.             gBattleTextBuff2[index] = STRINGID_STATFELL;
  11850.             index++;
  11851.             gBattleTextBuff2[index] = STRINGID_STATFELL >> 8;
  11852.             index++;
  11853.             gBattleTextBuff2[index] = B_BUFF_EOS;
  11854.  
  11855.             if (gBattleMons[gActiveBattler].statStages[statId] == 0)
  11856.                 gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  11857.             else
  11858.                 gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBattler);
  11859.  
  11860.         }
  11861.     }
  11862.     else // stat increase
  11863.     {
  11864.         statValue = GET_STAT_BUFF_VALUE(statValue);
  11865.         gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN;
  11866.         index = 1;
  11867.         if (statValue == 2)
  11868.         {
  11869.             gBattleTextBuff2[1] = B_BUFF_STRING;
  11870.             gBattleTextBuff2[2] = STRINGID_STATSHARPLY;
  11871.             gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8;
  11872.             index = 4;
  11873.         }
  11874.         gBattleTextBuff2[index] = B_BUFF_STRING;
  11875.         index++;
  11876.         gBattleTextBuff2[index] = STRINGID_STATROSE;
  11877.         index++;
  11878.         gBattleTextBuff2[index] = STRINGID_STATROSE >> 8;
  11879.         index++;
  11880.         gBattleTextBuff2[index] = B_BUFF_EOS;
  11881.  
  11882.         if (gBattleMons[gActiveBattler].statStages[statId] == 0xC)
  11883.             gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  11884.         else
  11885.             gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBattler);
  11886.     }
  11887.  
  11888.     gBattleMons[gActiveBattler].statStages[statId] += statValue;
  11889.     if (gBattleMons[gActiveBattler].statStages[statId] < 0)
  11890.         gBattleMons[gActiveBattler].statStages[statId] = 0;
  11891.     if (gBattleMons[gActiveBattler].statStages[statId] > 0xC)
  11892.         gBattleMons[gActiveBattler].statStages[statId] = 0xC;
  11893.  
  11894.     if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && flags & STAT_CHANGE_BS_PTR)
  11895.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  11896.  
  11897.     if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & STAT_CHANGE_BS_PTR))
  11898.         return STAT_CHANGE_DIDNT_WORK;
  11899.  
  11900.     return STAT_CHANGE_WORKED;
  11901. }
  11902.  
  11903. static void atk89_statbuffchange(void)
  11904. {
  11905.     u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  11906.     if (ChangeStatBuffs(gBattleStruct->statChanger & 0xF0, gBattleStruct->statChanger & 0xF, T2_READ_8(gBattlescriptCurrInstr + 1), jump_loc) == 0)
  11907.         gBattlescriptCurrInstr += 6;
  11908. }
  11909.  
  11910. static void atk8A_normalisebuffs(void) //haze
  11911. {
  11912.     int i, j;
  11913.     for (i = 0; i < gBattlersCount; i++)
  11914.     {
  11915.         for (j = 0; j < 8; j++)
  11916.         {
  11917.             gBattleMons[i].statStages[j] = 6;
  11918.         }
  11919.     }
  11920.     gBattlescriptCurrInstr++;
  11921. }
  11922.  
  11923. static void atk8B_setbide(void)
  11924. {
  11925.     gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS;
  11926.     gLockedMoves[gBankAttacker] = gCurrentMove;
  11927.     gTakenDmg[gBankAttacker] = 0;
  11928.     gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); //2 turns
  11929.     gBattlescriptCurrInstr++;
  11930. }
  11931.  
  11932. static void atk8C_confuseifrepeatingattackends(void)
  11933. {
  11934.     if (!(gBattleMons[gBankAttacker].status2 & STATUS2_LOCK_CONFUSE))
  11935.         gBattleCommunication[MOVE_EFFECT_BYTE] = 0x75;
  11936.     gBattlescriptCurrInstr++;
  11937. }
  11938.  
  11939. static void atk8D_setmultihitcounter(void)
  11940. {
  11941.     if (T2_READ_8(gBattlescriptCurrInstr + 1))
  11942.         gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1);
  11943.     else
  11944.     {
  11945.         gMultiHitCounter = Random() & 3;
  11946.         if (gMultiHitCounter > 1)
  11947.             gMultiHitCounter = (Random() & 3) + 2;
  11948.         else
  11949.             gMultiHitCounter += 2;
  11950.     }
  11951.     gBattlescriptCurrInstr += 2;
  11952. }
  11953.  
  11954. static void atk8E_initmultihitstring(void)
  11955. {
  11956.     ewram160E0(0) = 0xFD;
  11957.     ewram160E0(1) = 1;
  11958.     ewram160E0(2) = 1;
  11959.     ewram160E0(3) = 1;
  11960.     ewram160E0(4) = 0;
  11961.     ewram160E0(5) = 0xFF;
  11962.     gBattlescriptCurrInstr++;
  11963. }
  11964.  
  11965. static bool8 sub_80264C0(void)
  11966. {
  11967.     if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level)
  11968.     {
  11969.         ewram16064arr(gBankTarget) = gBattlerPartyIndexes[gBankTarget];
  11970.     }
  11971.     else
  11972.     {
  11973.         u16 random = Random() & 0xFF;
  11974.         if ((u32)((random * (gBattleMons[gBankAttacker].level + gBattleMons[gBankTarget].level) >> 8) + 1) <= (gBattleMons[gBankTarget].level / 4))
  11975.         {
  11976.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  11977.             return 0;
  11978.         }
  11979.         ewram16064arr(gBankTarget) = gBattlerPartyIndexes[gBankTarget];
  11980.     }
  11981.     gBattlescriptCurrInstr = BattleScript_SuccessForceOut;
  11982.     return 1;
  11983. }
  11984.  
  11985. static void atk8F_forcerandomswitch(void)
  11986. {
  11987.     if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER))
  11988.     {
  11989.         u8 i;
  11990.         struct Pokemon* party;
  11991.         u8 valid;
  11992.         u8 val;
  11993.         if (!GetBattlerSide(gBankTarget))
  11994.             party = gPlayerParty;
  11995.         else
  11996.             party = gEnemyParty;
  11997.  
  11998.         if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
  11999.         {
  12000.             valid = 0;
  12001.             val = 0;
  12002.             if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1)
  12003.                 val = 3;
  12004.             for (i = val; i < val + 3; i++)
  12005.             {
  12006.                 if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
  12007.                  && !GetMonData(&party[i], MON_DATA_IS_EGG)
  12008.                  && GetMonData(&party[i], MON_DATA_HP) != 0)
  12009.                     valid++;
  12010.             }
  12011.         }
  12012.         else
  12013.         {
  12014.             valid = 0;
  12015.             for (i = 0; i < 6; i++)
  12016.             {
  12017.                 if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
  12018.                  && !GetMonData(&party[i], MON_DATA_IS_EGG)
  12019.                  && GetMonData(&party[i], MON_DATA_HP) != 0)
  12020.                     valid++;
  12021.             }
  12022.         }
  12023.  
  12024.         if ((valid < 2 && (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE)
  12025.          || (valid < 3 && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)))
  12026.         {
  12027.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  12028.         }
  12029.         else if (sub_80264C0())
  12030.         {
  12031. #define MON_CAN_BATTLE(mon) (((GetMonData(mon, MON_DATA_SPECIES) && GetMonData(mon, MON_DATA_IS_EGG) != 1 && GetMonData(mon, MON_DATA_HP))))
  12032.             if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
  12033.             {
  12034.                 do
  12035.                 {
  12036.                     val = Random() % 3;
  12037.                     if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1)
  12038.                         i = val + 3;
  12039.                     else
  12040.                         i = val;
  12041.                 } while (i == gBattlerPartyIndexes[gBankTarget] || i == gBattlerPartyIndexes[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i]));
  12042.             }
  12043.             else
  12044.             {
  12045.                 if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  12046.                 {
  12047.                     do
  12048.                     {
  12049.                         i = Random() % 6;
  12050.                     } while (i == gBattlerPartyIndexes[gBankTarget] || i == gBattlerPartyIndexes[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i]));
  12051.                 }
  12052.                 else
  12053.                 {
  12054.                     do
  12055.                     {
  12056.                         i = Random() % 6;
  12057.                     } while (i == gBattlerPartyIndexes[gBankTarget] || !MON_CAN_BATTLE(&party[i]));
  12058.                 }
  12059.             }
  12060.             ewram16068arr(gBankTarget) = i;
  12061.             if (!IsLinkDoubleBattle())
  12062.                 sub_8012258(gBankTarget);
  12063.             sub_8094B6C(gBankTarget, i, 0);
  12064.             sub_8094B6C(gBankTarget ^ 2, i, 1);
  12065. #undef MON_CAN_BATTLE
  12066.         }
  12067.     }
  12068.     else
  12069.     {
  12070.         sub_80264C0();
  12071.     }
  12072. }
  12073.  
  12074. static void atk90_tryconversiontypechange(void)
  12075. {
  12076.     //randomly changes user's type to one of its moves' type
  12077.     u8 valid_moves = 0;
  12078.     u8 checked_move;
  12079.     u8 move_type;
  12080.     while (valid_moves < 4)
  12081.     {
  12082.         if (gBattleMons[gBankAttacker].moves[valid_moves] == 0)
  12083.             break;
  12084.         valid_moves++;
  12085.     }
  12086.  
  12087.     for (checked_move = 0; checked_move < valid_moves; checked_move++)
  12088.     {
  12089.         move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type;
  12090.         if (move_type == TYPE_MYSTERY)
  12091.         {
  12092.             if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)
  12093.                 move_type = TYPE_GHOST;
  12094.             else
  12095.                 move_type = TYPE_NORMAL;
  12096.         }
  12097.         if (move_type != gBattleMons[gBankAttacker].type1 && move_type != gBattleMons[gBankAttacker].type2)
  12098.             break;
  12099.     }
  12100.  
  12101.     if (checked_move == valid_moves)
  12102.     {
  12103.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  12104.     }
  12105.     else
  12106.     {
  12107.         do
  12108.         {
  12109.  
  12110.             while ((checked_move = Random() & 3) >= valid_moves);
  12111.  
  12112.             move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type;
  12113.             if (move_type == TYPE_MYSTERY)
  12114.             {
  12115.                 if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)
  12116.                     move_type = TYPE_GHOST;
  12117.                 else
  12118.                     move_type = TYPE_NORMAL;
  12119.             }
  12120.         } while (move_type == gBattleMons[gBankAttacker].type1 || move_type == gBattleMons[gBankAttacker].type2);
  12121.  
  12122.         gBattleMons[gBankAttacker].type1 = move_type;
  12123.         gBattleMons[gBankAttacker].type2 = move_type;
  12124.  
  12125.         gBattleTextBuff1[0] = 0xFD;
  12126.         gBattleTextBuff1[1] = 3;
  12127.         gBattleTextBuff1[2] = move_type;
  12128.         gBattleTextBuff1[3] = 0xFF;
  12129.  
  12130.         gBattlescriptCurrInstr += 5;
  12131.     }
  12132. }
  12133.  
  12134. static void atk91_givepaydaymoney(void)
  12135. {
  12136.     if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney)
  12137.     {
  12138.         AddMoney(&gSaveBlock1.money, gPaydayMoney * gBattleStruct->moneyMultiplier);
  12139.         gBattleTextBuff1[0] = 0xFD;
  12140.         gBattleTextBuff1[1] = 1;
  12141.         gBattleTextBuff1[2] = 2;
  12142.         gBattleTextBuff1[3] = 5;
  12143.         gBattleTextBuff1[4] = gPaydayMoney;
  12144.         gBattleTextBuff1[5] = uBYTE1_16(gPaydayMoney);
  12145.         gBattleTextBuff1[6] = 0xFF;
  12146.         BattleScriptPush(gBattlescriptCurrInstr + 1);
  12147.         gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString;
  12148.     }
  12149.     else
  12150.         gBattlescriptCurrInstr++;
  12151. }
  12152.  
  12153. static void atk92_setlightscreen(void)
  12154. {
  12155.     if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_LIGHTSCREEN)
  12156.     {
  12157.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  12158.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  12159.     }
  12160.     else
  12161.     {
  12162.         gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_LIGHTSCREEN;
  12163.         gSideTimers[GetBattlerPosition(gBankAttacker) & 1].lightscreenTimer = 5;
  12164.         if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2)
  12165.             gBattleCommunication[MULTISTRING_CHOOSER] = 4;
  12166.         else
  12167.             gBattleCommunication[MULTISTRING_CHOOSER] = 3;
  12168.     }
  12169.     gBattlescriptCurrInstr++;
  12170. }
  12171.  
  12172. #ifdef NOTMATCHING
  12173. static void atk93_tryKO(void)
  12174. {
  12175.    if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
  12176.         hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam;
  12177.     else
  12178.     {
  12179.         hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
  12180.         quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
  12181.     }
  12182.  
  12183.     gStringBank = gBankTarget;
  12184.  
  12185.     if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality)
  12186.     {
  12187.         RecordItemBattle(gBankTarget, hold_effect);
  12188.         gSpecialStatuses[gBankTarget].focusBanded = 1;
  12189.     }
  12190.     if (hold_effect == HOLD_EFFECT_FOCUS_SASH)
  12191.     {
  12192.         RecordItemBattle(gBankTarget, hold_effect);
  12193.         gSpecialStatuses[gBankTarget].focusBanded = 1;
  12194.     }
  12195.  
  12196.     if (gBattleMons[gBankTarget].ability == ABILITY_STURDY)
  12197.     {
  12198.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  12199.         gLastUsedAbility = ABILITY_STURDY;
  12200.         gBattlescriptCurrInstr = x;
  12201.         RecordAbilityBattle(gBankTarget, ABILITY_STURDY);
  12202.         return;
  12203.     }
  12204.  
  12205.     if (!(gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS))
  12206.     {
  12207.         u16 to_cmp = gBattleMons[gBankAttacker].level - gBattleMons[gBankTarget].level + gBattleMoves[gCurrentMove].accuracy;
  12208.         if (Random() % 0x64 + 1 < to_cmp || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level)
  12209.         {
  12210.             goto MOVE_RESULT_MISSED_LABEL;
  12211.         }
  12212.     }
  12213.     else
  12214.     {
  12215.         if (gDisableStructs[gBankTarget].bankWithSureHit != gBankAttacker || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level)
  12216.         {
  12217.  
  12218.         }
  12219.     }
  12220.  
  12221. MOVE_RESULT_MISSED_LABEL:
  12222.     gBattleTypeFlags |= MOVE_RESULT_MISSED;
  12223.     if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level)
  12224.         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  12225.     else
  12226.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  12227.     gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  12228. }
  12229.  
  12230. #else
  12231. __attribute((naked))
  12232. static void atk93_tryKO(void)
  12233. {
  12234.     asm(".syntax unified\n\
  12235.        push {r4-r7,lr}\n\
  12236.    mov r7, r10\n\
  12237.    mov r6, r9\n\
  12238.    mov r5, r8\n\
  12239.    push {r5-r7}\n\
  12240.    ldr r7, _08026BA8 @ =gBattleMons\n\
  12241.    ldr r6, _08026BAC @ =gBankTarget\n\
  12242.    ldrb r2, [r6]\n\
  12243.    movs r5, 0x58\n\
  12244.    adds r0, r2, 0\n\
  12245.    muls r0, r5\n\
  12246.    adds r1, r0, r7\n\
  12247.    ldrh r0, [r1, 0x2E]\n\
  12248.    cmp r0, 0xAF\n\
  12249.    bne _08026BB4\n\
  12250.    ldr r1, _08026BB0 @ =gEnigmaBerries\n\
  12251.    lsls r0, r2, 3\n\
  12252.    subs r0, r2\n\
  12253.    lsls r0, 2\n\
  12254.    adds r0, r1\n\
  12255.    ldrb r4, [r0, 0x7]\n\
  12256.    ldrb r6, [r0, 0x1A]\n\
  12257.    b _08026BCE\n\
  12258.    .align 2, 0\n\
  12259. _08026BA8: .4byte gBattleMons\n\
  12260. _08026BAC: .4byte gBankTarget\n\
  12261. _08026BB0: .4byte gEnigmaBerries\n\
  12262. _08026BB4:\n\
  12263.    ldrh r0, [r1, 0x2E]\n\
  12264.    bl ItemId_GetHoldEffect\n\
  12265.    lsls r0, 24\n\
  12266.    lsrs r4, r0, 24\n\
  12267.    ldrb r0, [r6]\n\
  12268.    muls r0, r5\n\
  12269.    adds r0, r7\n\
  12270.    ldrh r0, [r0, 0x2E]\n\
  12271.    bl ItemId_GetHoldEffectParam\n\
  12272.    lsls r0, 24\n\
  12273.    lsrs r6, r0, 24\n\
  12274. _08026BCE:\n\
  12275.    ldr r1, _08026C4C @ =gStringBank\n\
  12276.    ldr r5, _08026C50 @ =gBankTarget\n\
  12277.    ldrb r0, [r5]\n\
  12278.    strb r0, [r1]\n\
  12279.    cmp r4, 0x27\n\
  12280.    bne _08026C0C\n\
  12281.    bl Random\n\
  12282.    lsls r0, 16\n\
  12283.    lsrs r0, 16\n\
  12284.    movs r1, 0x64\n\
  12285.    bl __umodsi3\n\
  12286.    lsls r0, 16\n\
  12287.    lsrs r0, 16\n\
  12288.    cmp r0, r6\n\
  12289.    bcs _08026C0C\n\
  12290.    ldrb r0, [r5]\n\
  12291.    movs r1, 0x27\n\
  12292.    bl RecordItemBattle\n\
  12293.    ldr r2, _08026C54 @ =gSpecialStatuses\n\
  12294.    ldrb r1, [r5]\n\
  12295.    lsls r0, r1, 2\n\
  12296.    adds r0, r1\n\
  12297.    lsls r0, 2\n\
  12298.    adds r0, r2\n\
  12299.    ldrb r1, [r0]\n\
  12300.    movs r2, 0x80\n\
  12301.    orrs r1, r2\n\
  12302.    strb r1, [r0]\n\
  12303. _08026C0C:\n\
  12304.    ldr r0, _08026C58 @ =gBattleMons\n\
  12305.    mov r8, r0\n\
  12306.    ldr r1, _08026C50 @ =gBankTarget\n\
  12307.    ldrb r2, [r1]\n\
  12308.    movs r6, 0x58\n\
  12309.    adds r0, r2, 0\n\
  12310.    muls r0, r6\n\
  12311.    mov r3, r8\n\
  12312.    adds r5, r0, r3\n\
  12313.    adds r0, r5, 0\n\
  12314.    adds r0, 0x20\n\
  12315.    ldrb r3, [r0]\n\
  12316.    mov r10, r8\n\
  12317.    cmp r3, 0x5\n\
  12318.    bne _08026C6C\n\
  12319.    ldr r2, _08026C5C @ =gMoveResultFlags\n\
  12320.    ldrb r0, [r2]\n\
  12321.    movs r1, 0x1\n\
  12322.    orrs r0, r1\n\
  12323.    strb r0, [r2]\n\
  12324.    ldr r0, _08026C60 @ =gLastUsedAbility\n\
  12325.    strb r3, [r0]\n\
  12326.    ldr r1, _08026C64 @ =gBattlescriptCurrInstr\n\
  12327.    ldr r0, _08026C68 @ =BattleScript_SturdyPreventsOHKO\n\
  12328.    str r0, [r1]\n\
  12329.    ldr r1, _08026C50 @ =gBankTarget\n\
  12330.    ldrb r0, [r1]\n\
  12331.    movs r1, 0x5\n\
  12332.    bl RecordAbilityBattle\n\
  12333.    b _08026E40\n\
  12334.    .align 2, 0\n\
  12335. _08026C4C: .4byte gStringBank\n\
  12336. _08026C50: .4byte gBankTarget\n\
  12337. _08026C54: .4byte gSpecialStatuses\n\
  12338. _08026C58: .4byte gBattleMons\n\
  12339. _08026C5C: .4byte gMoveResultFlags\n\
  12340. _08026C60: .4byte gLastUsedAbility\n\
  12341. _08026C64: .4byte gBattlescriptCurrInstr\n\
  12342. _08026C68: .4byte BattleScript_SturdyPreventsOHKO\n\
  12343. _08026C6C:\n\
  12344.    ldr r1, _08026CE0 @ =gStatuses3\n\
  12345.    lsls r0, r2, 2\n\
  12346.    adds r0, r1\n\
  12347.    ldr r0, [r0]\n\
  12348.    movs r1, 0x18\n\
  12349.    ands r0, r1\n\
  12350.    cmp r0, 0\n\
  12351.    bne _08026CF4\n\
  12352.    ldr r1, _08026CE4 @ =gBattleMoves\n\
  12353.    ldr r0, _08026CE8 @ =gCurrentMove\n\
  12354.    ldrh r0, [r0]\n\
  12355.    lsls r2, r0, 1\n\
  12356.    adds r2, r0\n\
  12357.    lsls r2, 2\n\
  12358.    adds r2, r1\n\
  12359.    ldr r7, _08026CEC @ =gBankAttacker\n\
  12360.    ldrb r0, [r7]\n\
  12361.    muls r0, r6\n\
  12362.    add r0, r10\n\
  12363.    adds r0, 0x2A\n\
  12364.    ldrb r0, [r0]\n\
  12365.    adds r1, r5, 0\n\
  12366.    adds r1, 0x2A\n\
  12367.    ldrb r1, [r1]\n\
  12368.    subs r0, r1\n\
  12369.    ldrb r2, [r2, 0x3]\n\
  12370.    adds r0, r2\n\
  12371.    lsls r0, 16\n\
  12372.    lsrs r4, r0, 16\n\
  12373.    bl Random\n\
  12374.    lsls r0, 16\n\
  12375.    lsrs r0, 16\n\
  12376.    movs r1, 0x64\n\
  12377.    bl __umodsi3\n\
  12378.    lsls r0, 16\n\
  12379.    lsrs r0, 16\n\
  12380.    adds r0, 0x1\n\
  12381.    cmp r0, r4\n\
  12382.    bge _08026CDC\n\
  12383.    ldrb r0, [r7]\n\
  12384.    adds r1, r0, 0\n\
  12385.    muls r1, r6\n\
  12386.    add r1, r10\n\
  12387.    adds r1, 0x2A\n\
  12388.    ldr r2, _08026CF0 @ =gBankTarget\n\
  12389.    ldrb r0, [r2]\n\
  12390.    muls r0, r6\n\
  12391.    add r0, r10\n\
  12392.    adds r0, 0x2A\n\
  12393.    ldrb r1, [r1]\n\
  12394.    movs r4, 0x1\n\
  12395.    ldrb r0, [r0]\n\
  12396.    cmp r1, r0\n\
  12397.    bcs _08026D20\n\
  12398. _08026CDC:\n\
  12399.    mov r10, r8\n\
  12400.    b _08026DE0\n\
  12401.    .align 2, 0\n\
  12402. _08026CE0: .4byte gStatuses3\n\
  12403. _08026CE4: .4byte gBattleMoves\n\
  12404. _08026CE8: .4byte gCurrentMove\n\
  12405. _08026CEC: .4byte gBankAttacker\n\
  12406. _08026CF0: .4byte gBankTarget\n\
  12407. _08026CF4:\n\
  12408.    ldr r0, _08026D4C @ =gDisableStructs\n\
  12409.    lsls r1, r2, 3\n\
  12410.    subs r1, r2\n\
  12411.    lsls r1, 2\n\
  12412.    adds r1, r0\n\
  12413.    ldr r2, _08026D50 @ =gBankAttacker\n\
  12414.    ldrb r0, [r1, 0x15]\n\
  12415.    movs r4, 0\n\
  12416.    ldrb r3, [r2]\n\
  12417.    cmp r0, r3\n\
  12418.    bne _08026D20\n\
  12419.    ldrb r0, [r2]\n\
  12420.    muls r0, r6\n\
  12421.    add r0, r10\n\
  12422.    adds r0, 0x2A\n\
  12423.    adds r1, r5, 0\n\
  12424.    adds r1, 0x2A\n\
  12425.    ldrb r0, [r0]\n\
  12426.    ldrb r1, [r1]\n\
  12427.    cmp r0, r1\n\
  12428.    bcc _08026D20\n\
  12429.    movs r4, 0x1\n\
  12430. _08026D20:\n\
  12431.    cmp r4, 0\n\
  12432.    beq _08026DE0\n\
  12433.    ldr r0, _08026D54 @ =gProtectStructs\n\
  12434.    ldr r1, _08026D58 @ =gBankTarget\n\
  12435.    ldrb r2, [r1]\n\
  12436.    lsls r1, r2, 4\n\
  12437.    adds r1, r0\n\
  12438.    ldrb r0, [r1]\n\
  12439.    lsls r0, 30\n\
  12440.    cmp r0, 0\n\
  12441.    bge _08026D64\n\
  12442.    ldr r1, _08026D5C @ =gBattleMoveDamage\n\
  12443.    movs r0, 0x58\n\
  12444.    muls r0, r2\n\
  12445.    add r0, r10\n\
  12446.    ldrh r0, [r0, 0x28]\n\
  12447.    subs r0, 0x1\n\
  12448.    str r0, [r1]\n\
  12449.    ldr r2, _08026D60 @ =gMoveResultFlags\n\
  12450.    ldrb r0, [r2]\n\
  12451.    movs r1, 0x40\n\
  12452.    b _08026DC6\n\
  12453.    .align 2, 0\n\
  12454. _08026D4C: .4byte gDisableStructs\n\
  12455. _08026D50: .4byte gBankAttacker\n\
  12456. _08026D54: .4byte gProtectStructs\n\
  12457. _08026D58: .4byte gBankTarget\n\
  12458. _08026D5C: .4byte gBattleMoveDamage\n\
  12459. _08026D60: .4byte gMoveResultFlags\n\
  12460. _08026D64:\n\
  12461.    ldr r0, _08026DA0 @ =gSpecialStatuses\n\
  12462.    lsls r1, r2, 2\n\
  12463.    adds r1, r2\n\
  12464.    lsls r1, 2\n\
  12465.    adds r1, r0\n\
  12466.    ldrb r0, [r1]\n\
  12467.    lsrs r0, 7\n\
  12468.    cmp r0, 0\n\
  12469.    beq _08026DB4\n\
  12470.    ldr r1, _08026DA4 @ =gBattleMoveDamage\n\
  12471.    movs r3, 0x58\n\
  12472.    adds r0, r2, 0\n\
  12473.    muls r0, r3\n\
  12474.    add r0, r10\n\
  12475.    ldrh r0, [r0, 0x28]\n\
  12476.    subs r0, 0x1\n\
  12477.    str r0, [r1]\n\
  12478.    ldr r2, _08026DA8 @ =gMoveResultFlags\n\
  12479.    ldrb r0, [r2]\n\
  12480.    movs r1, 0x80\n\
  12481.    orrs r0, r1\n\
  12482.    strb r0, [r2]\n\
  12483.    ldr r1, _08026DAC @ =gLastUsedItem\n\
  12484.    ldr r2, _08026DB0 @ =gBankTarget\n\
  12485.    ldrb r0, [r2]\n\
  12486.    muls r0, r3\n\
  12487.    add r0, r10\n\
  12488.    ldrh r0, [r0, 0x2E]\n\
  12489.    strh r0, [r1]\n\
  12490.    b _08026DCA\n\
  12491.    .align 2, 0\n\
  12492. _08026DA0: .4byte gSpecialStatuses\n\
  12493. _08026DA4: .4byte gBattleMoveDamage\n\
  12494. _08026DA8: .4byte gMoveResultFlags\n\
  12495. _08026DAC: .4byte gLastUsedItem\n\
  12496. _08026DB0: .4byte gBankTarget\n\
  12497. _08026DB4:\n\
  12498.    ldr r1, _08026DD4 @ =gBattleMoveDamage\n\
  12499.    movs r0, 0x58\n\
  12500.    muls r0, r2\n\
  12501.    add r0, r10\n\
  12502.    ldrh r0, [r0, 0x28]\n\
  12503.    str r0, [r1]\n\
  12504.    ldr r2, _08026DD8 @ =gMoveResultFlags\n\
  12505.    ldrb r0, [r2]\n\
  12506.    movs r1, 0x10\n\
  12507. _08026DC6:\n\
  12508.    orrs r0, r1\n\
  12509.    strb r0, [r2]\n\
  12510. _08026DCA:\n\
  12511.    ldr r1, _08026DDC @ =gBattlescriptCurrInstr\n\
  12512.    ldr r0, [r1]\n\
  12513.    adds r0, 0x5\n\
  12514.    str r0, [r1]\n\
  12515.    b _08026E40\n\
  12516.    .align 2, 0\n\
  12517. _08026DD4: .4byte gBattleMoveDamage\n\
  12518. _08026DD8: .4byte gMoveResultFlags\n\
  12519. _08026DDC: .4byte gBattlescriptCurrInstr\n\
  12520. _08026DE0:\n\
  12521.    ldr r2, _08026E10 @ =gMoveResultFlags\n\
  12522.    ldrb r0, [r2]\n\
  12523.    movs r1, 0x1\n\
  12524.    orrs r0, r1\n\
  12525.    strb r0, [r2]\n\
  12526.    ldr r0, _08026E14 @ =gBankAttacker\n\
  12527.    ldrb r0, [r0]\n\
  12528.    movs r2, 0x58\n\
  12529.    adds r1, r0, 0\n\
  12530.    muls r1, r2\n\
  12531.    add r1, r10\n\
  12532.    adds r1, 0x2A\n\
  12533.    ldr r3, _08026E18 @ =gBankTarget\n\
  12534.    ldrb r0, [r3]\n\
  12535.    muls r0, r2\n\
  12536.    add r0, r10\n\
  12537.    adds r0, 0x2A\n\
  12538.    ldrb r1, [r1]\n\
  12539.    ldrb r0, [r0]\n\
  12540.    cmp r1, r0\n\
  12541.    bcc _08026E20\n\
  12542.    ldr r1, _08026E1C @ =gBattleCommunication\n\
  12543.    movs r0, 0\n\
  12544.    b _08026E24\n\
  12545.    .align 2, 0\n\
  12546. _08026E10: .4byte gMoveResultFlags\n\
  12547. _08026E14: .4byte gBankAttacker\n\
  12548. _08026E18: .4byte gBankTarget\n\
  12549. _08026E1C: .4byte gBattleCommunication\n\
  12550. _08026E20:\n\
  12551.    ldr r1, _08026E50 @ =gBattleCommunication\n\
  12552.    movs r0, 0x1\n\
  12553. _08026E24:\n\
  12554.    strb r0, [r1, 0x5]\n\
  12555.    ldr r3, _08026E54 @ =gBattlescriptCurrInstr\n\
  12556.    ldr r2, [r3]\n\
  12557.    ldrb r1, [r2, 0x1]\n\
  12558.    ldrb r0, [r2, 0x2]\n\
  12559.    lsls r0, 8\n\
  12560.    orrs r1, r0\n\
  12561.    ldrb r0, [r2, 0x3]\n\
  12562.    lsls r0, 16\n\
  12563.    orrs r1, r0\n\
  12564.    ldrb r0, [r2, 0x4]\n\
  12565.    lsls r0, 24\n\
  12566.    orrs r1, r0\n\
  12567.    str r1, [r3]\n\
  12568. _08026E40:\n\
  12569.    pop {r3-r5}\n\
  12570.    mov r8, r3\n\
  12571.    mov r9, r4\n\
  12572.    mov r10, r5\n\
  12573.    pop {r4-r7}\n\
  12574.    pop {r0}\n\
  12575.    bx r0\n\
  12576.    .align 2, 0\n\
  12577. _08026E50: .4byte gBattleCommunication\n\
  12578. _08026E54: .4byte gBattlescriptCurrInstr\n\
  12579.        .syntax divided");
  12580. }
  12581. #endif // NOTMATCHING
  12582.  
  12583. static void atk94_damagetohalftargethp(void) //super fang
  12584. {
  12585.     gBattleMoveDamage = gBattleMons[gBankTarget].hp / 2;
  12586.     if (gBattleMoveDamage == 0)
  12587.         gBattleMoveDamage = 1;
  12588.     gBattlescriptCurrInstr++;
  12589. }
  12590.  
  12591. static void atk95_setsandstorm(void)
  12592. {
  12593.     if (gBattleWeather & WEATHER_SANDSTORM_ANY)
  12594.     {
  12595.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  12596.         gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  12597.     }
  12598.     else
  12599.     {
  12600.         gBattleWeather = WEATHER_SANDSTORM_TEMPORARY;
  12601.         gBattleCommunication[MULTISTRING_CHOOSER] = 3;
  12602.         gWishFutureKnock.weatherDuration = 5;
  12603.     }
  12604.     gBattlescriptCurrInstr++;
  12605. }
  12606.  
  12607. static void atk96_weatherdamage(void)
  12608. {
  12609.     if (WEATHER_HAS_EFFECT)
  12610.     {
  12611.         if (gBattleWeather & WEATHER_SANDSTORM_ANY)
  12612.         {
  12613.             if (gBattleMons[gBankAttacker].type1 != TYPE_ROCK && gBattleMons[gBankAttacker].type1 != TYPE_STEEL && gBattleMons[gBankAttacker].type1 != TYPE_GROUND
  12614.              && gBattleMons[gBankAttacker].type2 != TYPE_ROCK && gBattleMons[gBankAttacker].type2 != TYPE_STEEL && gBattleMons[gBankAttacker].type2 != TYPE_GROUND
  12615.              && gBattleMons[gBankAttacker].ability != ABILITY_SAND_VEIL && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER))
  12616.             {
  12617.                 gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16;
  12618.                 if (gBattleMoveDamage == 0)
  12619.                     gBattleMoveDamage = 1;
  12620.             }
  12621.             else
  12622.             {
  12623.                 gBattleMoveDamage = 0;
  12624.             }
  12625.         }
  12626.         if (gBattleWeather & WEATHER_HAIL)
  12627.         {
  12628.             if (gBattleMons[gBankAttacker].type1 != TYPE_ICE && gBattleMons[gBankAttacker].type2 != TYPE_ICE && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER))
  12629.             {
  12630.                 gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16;
  12631.                 if (gBattleMoveDamage == 0)
  12632.                     gBattleMoveDamage = 1;
  12633.             }
  12634.             else
  12635.             {
  12636.                 gBattleMoveDamage = 0;
  12637.             }
  12638.         }
  12639.     }
  12640.     else
  12641.         gBattleMoveDamage = 0;
  12642.  
  12643.     if (gAbsentBattlerFlags & gBitTable[gBankAttacker])
  12644.         gBattleMoveDamage = 0;
  12645.  
  12646.     gBattlescriptCurrInstr++;
  12647. }
  12648.  
  12649. static void atk97_tryinfatuating(void)
  12650. {
  12651.     struct Pokemon *attacker, *target;
  12652.     u16 atk_species, def_species;
  12653.     u32 atk_pid, def_pid;
  12654.     if (!GetBattlerSide(gBankAttacker))
  12655.         attacker = &gPlayerParty[gBattlerPartyIndexes[gBankAttacker]];
  12656.     else
  12657.         attacker = &gEnemyParty[gBattlerPartyIndexes[gBankAttacker]];
  12658.  
  12659.     if (!GetBattlerSide(gBankTarget))
  12660.         target = &gPlayerParty[gBattlerPartyIndexes[gBankTarget]];
  12661.     else
  12662.         target = &gEnemyParty[gBattlerPartyIndexes[gBankTarget]];
  12663.  
  12664.     atk_species = GetMonData(attacker, MON_DATA_SPECIES);
  12665.     atk_pid = GetMonData(attacker, MON_DATA_PERSONALITY);
  12666.  
  12667.     def_species = GetMonData(target, MON_DATA_SPECIES);
  12668.     def_pid = GetMonData(target, MON_DATA_PERSONALITY);
  12669.  
  12670.     if (gBattleMons[gBankTarget].ability == ABILITY_OBLIVIOUS)
  12671.     {
  12672.         gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction;
  12673.         gLastUsedAbility = ABILITY_OBLIVIOUS;
  12674.         RecordAbilityBattle(gBankTarget, ABILITY_OBLIVIOUS);
  12675.     }
  12676.     else
  12677.     {
  12678.         if (GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == GetGenderFromSpeciesAndPersonality(def_species, def_pid)
  12679.             || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE || gBattleMons[gBankTarget].status2 & STATUS2_INFATUATION || GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == 0xFF
  12680.             || GetGenderFromSpeciesAndPersonality(def_species, def_pid) == 0xFF)
  12681.             {
  12682.                 gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  12683.             }
  12684.         else
  12685.         {
  12686.             gBattleMons[gBankTarget].status2 |=  (gBitTable[gBankAttacker] << 16);
  12687.             gBattlescriptCurrInstr += 5;
  12688.         }
  12689.     }
  12690. }
  12691.  
  12692. static void atk98_updatestatusicon(void)
  12693. {
  12694.     if (gBattleExecBuffer)
  12695.         return;
  12696.  
  12697.     if (T2_READ_8(gBattlescriptCurrInstr + 1) != 4)
  12698.     {
  12699.         gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  12700.         EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);
  12701.         MarkBufferBankForExecution(gActiveBattler);
  12702.         gBattlescriptCurrInstr += 2;
  12703.     }
  12704.     else
  12705.     {
  12706.         gActiveBattler = gBankAttacker;
  12707.         if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
  12708.         {
  12709.             EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);
  12710.             MarkBufferBankForExecution(gActiveBattler);
  12711.         }
  12712.         if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
  12713.         {
  12714.             gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2);
  12715.             if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
  12716.             {
  12717.                 EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);
  12718.                 MarkBufferBankForExecution(gActiveBattler);
  12719.             }
  12720.         }
  12721.         gBattlescriptCurrInstr += 2;
  12722.     }
  12723. }
  12724.  
  12725. static void atk99_setmist(void)
  12726. {
  12727.     if (gSideTimers[GetBattlerPosition(gBankAttacker) & 1].mistTimer)
  12728.     {
  12729.         gMoveResultFlags |= MOVE_RESULT_FAILED;
  12730.         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  12731.     }
  12732.     else
  12733.     {
  12734.         gSideTimers[GetBattlerPosition(gBankAttacker) & 1].mistTimer = 5;
  12735.         gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_MIST;
  12736.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  12737.     }
  12738.     gBattlescriptCurrInstr++;
  12739. }
  12740.  
  12741. static void atk9A_setfocusenergy(void)
  12742. {
  12743.     if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY)
  12744.     {
  12745.         gMoveResultFlags |= MOVE_RESULT_FAILED;
  12746.         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  12747.     }
  12748.     else
  12749.     {
  12750.         gBattleMons[gBankAttacker].status2 |= STATUS2_FOCUS_ENERGY;
  12751.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  12752.     }
  12753.     gBattlescriptCurrInstr++;
  12754. }
  12755.  
  12756. static void atk9B_transformdataexecution(void)
  12757. {
  12758.     gChosenMove = 0xFFFF;
  12759.     gBattlescriptCurrInstr++;
  12760.     if (gBattleMons[gBankTarget].status2 & STATUS2_TRANSFORMED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)
  12761.     {
  12762.         gMoveResultFlags |= MOVE_RESULT_FAILED;
  12763.         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  12764.     }
  12765.     else
  12766.     {
  12767.         u32 i; s32 j;
  12768.         u8 *atk_data, *def_data;
  12769.         gBattleMons[gBankAttacker].status2 |= STATUS2_TRANSFORMED;
  12770.         gDisableStructs[gBankAttacker].disabledMove = 0;
  12771.         gDisableStructs[gBankAttacker].disableTimer1 = 0;
  12772.         gDisableStructs[gBankAttacker].transformedMonPersonality = gBattleMons[gBankTarget].personality;
  12773.         gDisableStructs[gBankAttacker].unk18_b = 0;
  12774.  
  12775.         gBattleTextBuff1[0] = 0xFD;
  12776.         gBattleTextBuff1[1] = 6;
  12777.         gBattleTextBuff1[2] = (gBattleMons[gBankTarget].species);
  12778.         gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].species);
  12779.         gBattleTextBuff1[4] = 0xFF;
  12780.  
  12781.         atk_data = (u8*)(&gBattleMons[gBankAttacker]);
  12782.         def_data = (u8*)(&gBattleMons[gBankTarget]);
  12783.  
  12784.         for (i = 0; i < 0x24; i++)
  12785.             atk_data[i] = def_data[i];
  12786.  
  12787.         for (j = 0; j < 4; j++)
  12788.         {
  12789.             if (gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp < 5)
  12790.                 gBattleMons[gBankAttacker].pp[j] = gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp;
  12791.             else
  12792.                 gBattleMons[gBankAttacker].pp[j] = 5;
  12793.         }
  12794.  
  12795.         gActiveBattler = gBankAttacker;
  12796.         EmitResetActionMoveSelection(0, 2);
  12797.         MarkBufferBankForExecution(gActiveBattler);
  12798.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  12799.     }
  12800. }
  12801.  
  12802. static void atk9C_setsubstitute(void)
  12803. {
  12804.     u32 hp = gBattleMons[gBankAttacker].maxHP / 4;
  12805.     if (gBattleMons[gBankAttacker].maxHP / 4 == 0)
  12806.         hp = 1;
  12807.     if (gBattleMons[gBankAttacker].hp <= hp)
  12808.     {
  12809.         gBattleMoveDamage = 0;
  12810.         gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  12811.     }
  12812.     else
  12813.     {
  12814.         gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4;
  12815.         if (gBattleMoveDamage == 0)
  12816.             gBattleMoveDamage = 1;
  12817.         gBattleMons[gBankAttacker].status2 |= STATUS2_SUBSTITUTE;
  12818.         gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED);
  12819.         gDisableStructs[gBankAttacker].substituteHP = gBattleMoveDamage;
  12820.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  12821.         gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE;
  12822.     }
  12823.     gBattlescriptCurrInstr++;
  12824. }
  12825.  
  12826. static bool8 IsMoveUncopyable(u16 move)
  12827. {
  12828.     int i;
  12829.     for (i = 0; sMovesForbiddenToCopy[i] != 0xFFFE && sMovesForbiddenToCopy[i] != move; i++) {}
  12830.     return (sMovesForbiddenToCopy[i] != 0xFFFE);
  12831. }
  12832.  
  12833. static void atk9D_mimicattackcopy(void)
  12834. {
  12835.     gChosenMove = 0xFFFF;
  12836.     if (IsMoveUncopyable(gLastUsedMove[gBankTarget]) || gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED
  12837.         || gLastUsedMove[gBankTarget] == 0 || gLastUsedMove[gBankTarget] == 0xFFFF)
  12838.     {
  12839.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  12840.     }
  12841.     else
  12842.     {
  12843.         int i;
  12844.         for (i = 0; i < 4; i++)
  12845.         {
  12846.             if (gBattleMons[gBankAttacker].moves[i] == gLastUsedMove[gBankTarget])
  12847.                 break;
  12848.         }
  12849.         if (i == 4)
  12850.         {
  12851.             gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastUsedMove[gBankTarget];
  12852.             if (gBattleMoves[gLastUsedMove[gBankTarget]].pp < 5)
  12853.                 gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastUsedMove[gBankTarget]].pp;
  12854.             else
  12855.                 gBattleMons[gBankAttacker].pp[gCurrMovePos] = 5;
  12856.  
  12857.             gBattleTextBuff1[0] = 0xFD;
  12858.             gBattleTextBuff1[1] = 2;
  12859.             gBattleTextBuff1[2] = gLastUsedMove[gBankTarget];
  12860.             gBattleTextBuff1[3] = uBYTE1_16(gLastUsedMove[gBankTarget]);
  12861.             gBattleTextBuff1[4] = 0xFF;
  12862.  
  12863.             gDisableStructs[gBankAttacker].unk18_b |= gBitTable[gCurrMovePos];
  12864.             gBattlescriptCurrInstr += 5;
  12865.         }
  12866.         else
  12867.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  12868.     }
  12869. }
  12870.  
  12871. #if DEBUG
  12872. NAKED
  12873. static void atk9E_metronome(void)
  12874. {
  12875.     asm("\
  12876.     push    {r4, r5, r6, r7, lr}\n\
  12877.     mov r7, r8\n\
  12878.     push    {r7}\n\
  12879.     ldr r6, ._3076      @ gBankAttacker\n\
  12880.     ldrb    r2, [r6]\n\
  12881.     lsl r1, r2, #0x1\n\
  12882.     ldr r0, ._3076 + 4  @ \n\
  12883.     add r3, r1, r0\n\
  12884.     ldr r5, ._3076 + 8  @ \n\
  12885.     mov r4, #0x58\n\
  12886.     add r0, r2, #0\n\
  12887.     mul r0, r0, r4\n\
  12888.     add r1, r0, r5\n\
  12889.     ldrh    r0, [r1, #0xe]\n\
  12890.     cmp r0, #0\n\
  12891.     bne ._3071  @cond_branch\n\
  12892.     ldrh    r2, [r1, #0x10]\n\
  12893.     cmp r2, #0\n\
  12894.     beq ._3071  @cond_branch\n\
  12895.     ldrh    r0, [r1, #0x12]\n\
  12896.     cmp r0, #0\n\
  12897.     beq ._3071  @cond_branch\n\
  12898.     ldrh    r0, [r3]\n\
  12899.     cmp r0, #0\n\
  12900.     bne ._3072  @cond_branch\n\
  12901.     strh    r2, [r3]\n\
  12902. ._3072:\n\
  12903.     ldr r1, ._3076 + 12 @ \n\
  12904.     ldrh    r0, [r3]\n\
  12905.     strh    r0, [r1]\n\
  12906.     ldrb    r0, [r6]\n\
  12907.     mul r0, r0, r4\n\
  12908.     add r0, r0, r5\n\
  12909.     ldrh    r5, [r0, #0x10]\n\
  12910.     ldrh    r2, [r0, #0x12]\n\
  12911.     add r7, r1, #0\n\
  12912.     cmp r5, r2\n\
  12913.     bcs ._3073  @cond_branch\n\
  12914.     ldrh    r0, [r3]\n\
  12915.     cmp r0, r2\n\
  12916.     beq ._3074  @cond_branch\n\
  12917.     add r0, r0, #0x1\n\
  12918.     b   ._3079\n\
  12919. ._3077:\n\
  12920.     .align  2, 0\n\
  12921. ._3076:\n\
  12922.     .word   gBankAttacker\n\
  12923.     .word   +0x20160b4\n\
  12924.     .word   gBattleMons\n\
  12925.     .word   gCurrentMove\n\
  12926. ._3073:\n\
  12927.     ldrh    r4, [r3]\n\
  12928.     add r1, r4, #0\n\
  12929.     mov r0, #0xb1\n\
  12930.     lsl r0, r0, #0x1\n\
  12931.     cmp r1, r0\n\
  12932.     bne ._3078  @cond_branch\n\
  12933.     mov r0, #0x1\n\
  12934.     b   ._3079\n\
  12935. ._3078:\n\
  12936.     cmp r1, r2\n\
  12937.     bne ._3080  @cond_branch\n\
  12938. ._3074:\n\
  12939.     strh    r5, [r3]\n\
  12940.     b   ._3081\n\
  12941. ._3080:\n\
  12942.     add r0, r4, #1\n\
  12943. ._3079:\n\
  12944.     strh    r0, [r3]\n\
  12945. ._3081:\n\
  12946.     ldr r4, ._3083      @ gHitMarker\n\
  12947.     ldr r2, [r4]\n\
  12948.     ldr r0, ._3083 + 4  @ 0xfffffbff\n\
  12949.     and r2, r2, r0\n\
  12950.     str r2, [r4]\n\
  12951.     ldr r6, ._3083 + 8  @ gBattlescriptCurrInstr\n\
  12952.     ldr r5, ._3083 + 12 @ gBattleScriptsForMoveEffects\n\
  12953.     ldr r3, ._3083 + 16 @ gBattleMoves\n\
  12954.     ldrh    r1, [r7]\n\
  12955.     lsl r0, r1, #0x1\n\
  12956.     add r0, r0, r1\n\
  12957.     lsl r0, r0, #0x2\n\
  12958.     add r0, r0, r3\n\
  12959.     ldrb    r0, [r0]\n\
  12960.     lsl r0, r0, #0x2\n\
  12961.     add r0, r0, r5\n\
  12962.     ldr r0, [r0]\n\
  12963.     str r0, [r6]\n\
  12964.     mov r0, #0x80\n\
  12965.     lsl r0, r0, #0x4\n\
  12966.     orr r2, r2, r0\n\
  12967.     str r2, [r4]\n\
  12968.     ldrh    r0, [r7]\n\
  12969.     b   ._3082\n\
  12970. ._3084:\n\
  12971.     .align  2, 0\n\
  12972. ._3083:\n\
  12973.     .word   gHitMarker\n\
  12974.     .word   0xfffffbff\n\
  12975.     .word   gBattlescriptCurrInstr\n\
  12976.     .word   gBattleScriptsForMoveEffects\n\
  12977.     .word   gBattleMoves\n\
  12978. ._3071:\n\
  12979.     ldr r7, ._3090      @ gCurrentMove\n\
  12980.     mov r6, #0xb1\n\
  12981.     lsl r6, r6, #0x1\n\
  12982.     ldr r5, ._3090 + 4  @ sMovesForbiddenToCopy\n\
  12983.     ldr r0, ._3090 + 8  @ gBattlescriptCurrInstr\n\
  12984.     mov r8, r0\n\
  12985. ._3089:\n\
  12986.     bl  Random\n\
  12987.     ldr r2, ._3090 + 12 @ 0x1ff\n\
  12988.     add r1, r2, #0\n\
  12989.     and r0, r0, r1\n\
  12990.     add r0, r0, #0x1\n\
  12991.     strh    r0, [r7]\n\
  12992.     cmp r0, r6\n\
  12993.     bhi ._3089  @cond_branch\n\
  12994.     mov r0, #0x3\n\
  12995. ._3086:\n\
  12996.     sub r0, r0, #0x1\n\
  12997.     cmp r0, #0\n\
  12998.     bge ._3086  @cond_branch\n\
  12999.     ldr r4, ._3090      @ gCurrentMove\n\
  13000.     ldrh    r2, [r4]\n\
  13001.     ldr r3, ._3090 + 16 @ 0xffff\n\
  13002.     sub r0, r5, #2\n\
  13003. ._3088:\n\
  13004.     add r0, r0, #0x2\n\
  13005.     ldrh    r1, [r0]\n\
  13006.     cmp r1, r2\n\
  13007.     beq ._3087  @cond_branch\n\
  13008.     cmp r1, r3\n\
  13009.     bne ._3088  @cond_branch\n\
  13010. ._3087:\n\
  13011.     ldr r0, ._3090 + 16 @ 0xffff\n\
  13012.     cmp r1, r0\n\
  13013.     bne ._3089  @cond_branch\n\
  13014.     ldr r2, ._3090 + 20 @ gHitMarker\n\
  13015.     ldr r0, [r2]\n\
  13016.     ldr r1, ._3090 + 24 @ 0xfffffbff\n\
  13017.     and r0, r0, r1\n\
  13018.     str r0, [r2]\n\
  13019.     ldr r3, ._3090 + 28 @ gBattleScriptsForMoveEffects\n\
  13020.     ldr r2, ._3090 + 32 @ gBattleMoves\n\
  13021.     ldrh    r1, [r4]\n\
  13022.     lsl r0, r1, #0x1\n\
  13023.     add r0, r0, r1\n\
  13024.     lsl r0, r0, #0x2\n\
  13025.     add r0, r0, r2\n\
  13026.     ldrb    r0, [r0]\n\
  13027.     lsl r0, r0, #0x2\n\
  13028.     add r0, r0, r3\n\
  13029.     ldr r0, [r0]\n\
  13030.     mov r1, r8\n\
  13031.     str r0, [r1]\n\
  13032.     ldrh    r0, [r4]\n\
  13033. ._3082:\n\
  13034.     mov r1, #0x0\n\
  13035.     bl  GetMoveTarget\n\
  13036.     ldr r1, ._3090 + 36 @ gBankTarget\n\
  13037.     strb    r0, [r1]\n\
  13038.     pop {r3}\n\
  13039.     mov r8, r3\n\
  13040.     pop {r4, r5, r6, r7}\n\
  13041.     pop {r0}\n\
  13042.     bx  r0\n\
  13043. ._3091:\n\
  13044.     .align  2, 0\n\
  13045. ._3090:\n\
  13046.     .word   gCurrentMove\n\
  13047.     .word   sMovesForbiddenToCopy\n\
  13048.     .word   gBattlescriptCurrInstr\n\
  13049.     .word   0x1ff\n\
  13050.     .word   0xffff\n\
  13051.     .word   gHitMarker\n\
  13052.     .word   0xfffffbff\n\
  13053.     .word   gBattleScriptsForMoveEffects\n\
  13054.     .word   gBattleMoves\n\
  13055.     .word   gBankTarget");
  13056. }
  13057. #else
  13058. #ifdef NONMATCHING
  13059. static void atk9E_metronome(void)
  13060. {
  13061.     // sMovesForbiddenToCopy
  13062.     int i;
  13063.     do
  13064.     {
  13065.         while ((gCurrentMove = (Random() & 0x1FF) + 1) > 0x162);
  13066.         for (i = 0; sMovesForbiddenToCopy[i] != gCurrentMove && sMovesForbiddenToCopy[i] != 0xFFFF; i++);
  13067.     } while (sMovesForbiddenToCopy[i] != 0xFFFF);
  13068.  
  13069.     gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  13070.     gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
  13071.     gBankTarget = GetMoveTarget(gCurrentMove, 0);
  13072. }
  13073.  
  13074. #else
  13075. NAKED
  13076. static void atk9E_metronome(void)
  13077. {
  13078.     asm(".syntax unified\n\
  13079.    push {r4-r7,lr}\n\
  13080.    mov r7, r8\n\
  13081.    push {r7}\n\
  13082.    ldr r7, _08027938 @ =gCurrentMove\n\
  13083.    movs r6, 0xB1\n\
  13084.    lsls r6, 1\n\
  13085.    ldr r5, _0802793C @ =sMovesForbiddenToCopy\n\
  13086.    ldr r0, _08027940 @ =gBattlescriptCurrInstr\n\
  13087.    mov r8, r0\n\
  13088. _080278CA:\n\
  13089.    bl Random\n\
  13090.    ldr r2, _08027944 @ =0x000001ff\n\
  13091.    adds r1, r2, 0\n\
  13092.    ands r0, r1\n\
  13093.    adds r0, 0x1\n\
  13094.    strh r0, [r7]\n\
  13095.    cmp r0, r6\n\
  13096.    bhi _080278CA\n\
  13097.    movs r0, 0x3\n\
  13098. _080278DE:\n\
  13099.    subs r0, 0x1\n\
  13100.    cmp r0, 0\n\
  13101.    bge _080278DE\n\
  13102.    ldr r4, _08027938 @ =gCurrentMove\n\
  13103.    ldrh r2, [r4]\n\
  13104.    ldr r3, _08027948 @ =0x0000ffff\n\
  13105.    subs r0, r5, 0x2\n\
  13106. _080278EC:\n\
  13107.    adds r0, 0x2\n\
  13108.    ldrh r1, [r0]\n\
  13109.    cmp r1, r2\n\
  13110.    beq _080278F8\n\
  13111.    cmp r1, r3\n\
  13112.    bne _080278EC\n\
  13113. _080278F8:\n\
  13114.    ldr r0, _08027948 @ =0x0000ffff\n\
  13115.    cmp r1, r0\n\
  13116.    bne _080278CA\n\
  13117.    ldr r2, _0802794C @ =gHitMarker\n\
  13118.    ldr r0, [r2]\n\
  13119.    ldr r1, _08027950 @ =0xfffffbff\n\
  13120.    ands r0, r1\n\
  13121.    str r0, [r2]\n\
  13122.    ldr r3, _08027954 @ =gBattleScriptsForMoveEffects\n\
  13123.    ldr r2, _08027958 @ =gBattleMoves\n\
  13124.    ldrh r1, [r4]\n\
  13125.    lsls r0, r1, 1\n\
  13126.    adds r0, r1\n\
  13127.    lsls r0, 2\n\
  13128.    adds r0, r2\n\
  13129.    ldrb r0, [r0]\n\
  13130.    lsls r0, 2\n\
  13131.    adds r0, r3\n\
  13132.    ldr r0, [r0]\n\
  13133.    mov r1, r8\n\
  13134.    str r0, [r1]\n\
  13135.    ldrh r0, [r4]\n\
  13136.    movs r1, 0\n\
  13137.    bl GetMoveTarget\n\
  13138.    ldr r1, _0802795C @ =gBankTarget\n\
  13139.    strb r0, [r1]\n\
  13140.    pop {r3}\n\
  13141.    mov r8, r3\n\
  13142.    pop {r4-r7}\n\
  13143.    pop {r0}\n\
  13144.    bx r0\n\
  13145.    .align 2, 0\n\
  13146. _08027938: .4byte gCurrentMove\n\
  13147. _0802793C: .4byte sMovesForbiddenToCopy\n\
  13148. _08027940: .4byte gBattlescriptCurrInstr\n\
  13149. _08027944: .4byte 0x000001ff\n\
  13150. _08027948: .4byte 0x0000ffff\n\
  13151. _0802794C: .4byte gHitMarker\n\
  13152. _08027950: .4byte 0xfffffbff\n\
  13153. _08027954: .4byte gBattleScriptsForMoveEffects\n\
  13154. _08027958: .4byte gBattleMoves\n\
  13155. _0802795C: .4byte gBankTarget\n\
  13156.        .syntax divided");
  13157. }
  13158. #endif // NONMATCHING
  13159. #endif
  13160.  
  13161. static void atk9F_dmgtolevel(void)
  13162. {
  13163.     gBattleMoveDamage = gBattleMons[gBankAttacker].level;
  13164.     gBattlescriptCurrInstr++;
  13165. }
  13166.  
  13167. static void atkA0_psywavedamageeffect(void)
  13168. {
  13169.     s32 rand_dmg;
  13170.     while ((rand_dmg = (Random() & 0xF)) > 0xA);
  13171.     rand_dmg *= 10;
  13172.     gBattleMoveDamage = gBattleMons[gBankAttacker].level * (rand_dmg + 50) / 100;
  13173.     gBattlescriptCurrInstr++;
  13174. }
  13175.  
  13176. static void atkA1_counterdamagecalculator(void)
  13177. {
  13178.     u8 atk_side = GetBattlerSide(gBankAttacker);
  13179.     u8 def_side = GetBattlerSide(gProtectStructs[gBankAttacker].physicalBank);
  13180.     if (gProtectStructs[gBankAttacker].physicalDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp)
  13181.     {
  13182.         gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2;
  13183.         if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp)
  13184.             gBankTarget = gSideTimers[def_side].followmeTarget;
  13185.         else
  13186.             gBankTarget = gProtectStructs[gBankAttacker].physicalBank;
  13187.         gBattlescriptCurrInstr += 5;
  13188.     }
  13189.     else
  13190.     {
  13191.         gSpecialStatuses[gBankAttacker].flag20 = 1;
  13192.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13193.     }
  13194. }
  13195.  
  13196. static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the physical -> special field changes
  13197. {
  13198.     u8 atk_side = GetBattlerSide(gBankAttacker);
  13199.     u8 def_side = GetBattlerSide(gProtectStructs[gBankAttacker].specialBank);
  13200.     if (gProtectStructs[gBankAttacker].specialDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp)
  13201.     {
  13202.         gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2;
  13203.         if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp)
  13204.             gBankTarget = gSideTimers[def_side].followmeTarget;
  13205.         else
  13206.             gBankTarget = gProtectStructs[gBankAttacker].specialBank;
  13207.         gBattlescriptCurrInstr += 5;
  13208.     }
  13209.     else
  13210.     {
  13211.         gSpecialStatuses[gBankAttacker].flag20 = 1;
  13212.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13213.     }
  13214. }
  13215.  
  13216. static void atkA3_disablelastusedattack(void)
  13217. {
  13218.     int i;
  13219.     for (i = 0; i < 4; i++)
  13220.     {
  13221.         if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget])
  13222.             break;
  13223.     }
  13224.     if (gDisableStructs[gBankTarget].disabledMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0)
  13225.     {
  13226.         gBattleTextBuff1[0] = 0xFD;
  13227.         gBattleTextBuff1[1] = 2;
  13228.         gBattleTextBuff1[2] = gBattleMons[gBankTarget].moves[i];
  13229.         gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].moves[i]);
  13230.         gBattleTextBuff1[4] = 0xFF;
  13231.  
  13232.         gDisableStructs[gBankTarget].disabledMove = gBattleMons[gBankTarget].moves[i];
  13233.         gDisableStructs[gBankTarget].disableTimer1 = (Random() & 3) + 2;
  13234.         gDisableStructs[gBankTarget].disableTimer2 = gDisableStructs[gBankTarget].disableTimer1; //that's interesting
  13235.         gBattlescriptCurrInstr += 5;
  13236.     }
  13237.     else
  13238.     {
  13239.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13240.     }
  13241. }
  13242.  
  13243. static void atkA4_trysetencore(void)
  13244. {
  13245.     int i;
  13246.     for (i = 0; i < 4; i++)
  13247.     {
  13248.         if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget])
  13249.             break;
  13250.     }
  13251.     if (gLastUsedMove[gBankTarget] == MOVE_STRUGGLE || gLastUsedMove[gBankTarget] == MOVE_ENCORE || gLastUsedMove[gBankTarget] == MOVE_MIRROR_MOVE)
  13252.         i = 4;
  13253.     if (gDisableStructs[gBankTarget].encoredMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0)
  13254.     {
  13255.         gDisableStructs[gBankTarget].encoredMove = gBattleMons[gBankTarget].moves[i];
  13256.         gDisableStructs[gBankTarget].encoredMovePos = i;
  13257.         gDisableStructs[gBankTarget].encoreTimer1 = (Random() & 3) + 3;
  13258.         gDisableStructs[gBankTarget].encoreTimer2 = gDisableStructs[gBankTarget].encoreTimer1;
  13259.         gBattlescriptCurrInstr += 5;
  13260.     }
  13261.     else
  13262.     {
  13263.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13264.     }
  13265. }
  13266.  
  13267. static void atkA5_painsplitdmgcalc(void)
  13268. {
  13269.     if (!(gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE))
  13270.     {
  13271.         s32 hp_diff = (gBattleMons[gBankAttacker].hp + gBattleMons[gBankTarget].hp) / 2;
  13272.         s32 to_store = gBattleMoveDamage = gBattleMons[gBankTarget].hp - hp_diff;
  13273.         gBattleStruct->unk16014 = sBYTE0_32(to_store);
  13274.         gBattleStruct->unk16015 = sBYTE1_32(to_store);
  13275.         gBattleStruct->unk16016 = sBYTE2_32(to_store);
  13276.         gBattleStruct->unk16017 = sBYTE3_32(to_store);
  13277.  
  13278.         gBattleMoveDamage = gBattleMons[gBankAttacker].hp - hp_diff;
  13279.         gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF;
  13280.  
  13281.         gBattlescriptCurrInstr += 5;
  13282.     }
  13283.     else
  13284.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13285. }
  13286.  
  13287. #ifdef NONMATCHING
  13288. static void atkA6_settypetorandomresistance(void)
  13289. {
  13290.     if (gLastLandedMoves[gBankAttacker] == 0 || gLastLandedMoves[gBankAttacker] == 0xFFFF || (IsTwoTurnsMove(gLastLandedMoves[gBankAttacker]) && !gProtectStructs[gBankAttacker].physicalDmg && !gProtectStructs[gBankAttacker].specialDmg))
  13291.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13292.     else
  13293.     {
  13294.         int type = 0, rands = 0;
  13295.         do
  13296.         {
  13297.             while (((type = (Random() & 0x7F)) > 0x70));
  13298.             type *= 3;
  13299.             if (gTypeEffectiveness[type] == gLastHitByType[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1])
  13300.             {
  13301.                 gBattleMons[gBankAttacker].type1 = type;
  13302.                 gBattleMons[gBankAttacker].type2 = type;
  13303.                 gBattleTextBuff1[0] = 0xFD;
  13304.                 gBattleTextBuff1[1] = 3;
  13305.                 gBattleTextBuff1[2] = type;
  13306.                 gBattleTextBuff1[3] = 0xFF;
  13307.                 gBattlescriptCurrInstr += 5;
  13308.                 return;
  13309.             }
  13310.             rands++;
  13311.         } while (rands <= 999);
  13312.  
  13313.         type = 0, rands = 0;
  13314.         do
  13315.         {
  13316.             if (gTypeEffectiveness[type] == 0xFE || gTypeEffectiveness[type] != 0xFF)
  13317.             {
  13318.                 if (gTypeEffectiveness[type] == gLastHitByType[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1])
  13319.                 {
  13320.                     gBattleMons[gBankAttacker].type1 = gTypeEffectiveness[rands + 1];
  13321.                     gBattleMons[gBankAttacker].type2 = gTypeEffectiveness[rands + 1];
  13322.                     gBattleTextBuff1[0] = 0xFD;
  13323.                     gBattleTextBuff1[1] = 3;
  13324.                     gBattleTextBuff1[2] = gTypeEffectiveness[rands + 1];
  13325.                     gBattleTextBuff1[3] = 0xFF;
  13326.                     gBattlescriptCurrInstr += 5;
  13327.                     return;
  13328.                 }
  13329.             }
  13330.             type += 3, rands += 3;
  13331.         } while (rands < 336);
  13332.  
  13333.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13334.     }
  13335. }
  13336.  
  13337. #else
  13338. NAKED
  13339. static void atkA6_settypetorandomresistance(void)
  13340. {
  13341.     asm(".syntax unified\n\
  13342.    push {r4-r7,lr}\n\
  13343.    mov r7, r10\n\
  13344.    mov r6, r9\n\
  13345.    mov r5, r8\n\
  13346.    push {r5-r7}\n\
  13347.    ldr r1, _08027FA8 @ =gLastLandedMoves\n\
  13348.    ldr r4, _08027FAC @ =gBankAttacker\n\
  13349.    ldrb r0, [r4]\n\
  13350.    lsls r0, 1\n\
  13351.    adds r2, r0, r1\n\
  13352.    ldrh r1, [r2]\n\
  13353.    cmp r1, 0\n\
  13354.    beq _08027F8C\n\
  13355.    ldr r0, _08027FB0 @ =0x0000ffff\n\
  13356.    cmp r1, r0\n\
  13357.    beq _08027F8C\n\
  13358.    ldrh r0, [r2]\n\
  13359.    bl IsTwoTurnsMove\n\
  13360.    lsls r0, 24\n\
  13361.    cmp r0, 0\n\
  13362.    beq _08028024\n\
  13363.    ldr r2, _08027FB4 @ =gProtectStructs\n\
  13364.    ldrb r0, [r4]\n\
  13365.    lsls r1, r0, 4\n\
  13366.    adds r0, r2, 0x4\n\
  13367.    adds r0, r1, r0\n\
  13368.    ldr r0, [r0]\n\
  13369.    cmp r0, 0\n\
  13370.    bne _08028024\n\
  13371.    adds r0, r2, 0\n\
  13372.    adds r0, 0x8\n\
  13373.    adds r0, r1, r0\n\
  13374.    ldr r0, [r0]\n\
  13375.    cmp r0, 0\n\
  13376.    bne _08028024\n\
  13377. _08027F8C:\n\
  13378.    ldr r3, _08027FB8 @ =gBattlescriptCurrInstr\n\
  13379.    ldr r2, [r3]\n\
  13380.    ldrb r1, [r2, 0x1]\n\
  13381.    ldrb r0, [r2, 0x2]\n\
  13382.    lsls r0, 8\n\
  13383.    orrs r1, r0\n\
  13384.    ldrb r0, [r2, 0x3]\n\
  13385.    lsls r0, 16\n\
  13386.    orrs r1, r0\n\
  13387.    ldrb r0, [r2, 0x4]\n\
  13388.    lsls r0, 24\n\
  13389.    orrs r1, r0\n\
  13390.    str r1, [r3]\n\
  13391.    b _08028110\n\
  13392.    .align 2, 0\n\
  13393. _08027FA8: .4byte gLastLandedMoves\n\
  13394. _08027FAC: .4byte gBankAttacker\n\
  13395. _08027FB0: .4byte 0x0000ffff\n\
  13396. _08027FB4: .4byte gProtectStructs\n\
  13397. _08027FB8: .4byte gBattlescriptCurrInstr\n\
  13398. _08027FBC:\n\
  13399.    mov r0, r12\n\
  13400.    strb r5, [r0]\n\
  13401.    mov r1, r10\n\
  13402.    ldrb r0, [r1]\n\
  13403.    muls r0, r2\n\
  13404.    adds r0, r7\n\
  13405.    adds r0, 0x22\n\
  13406.    strb r5, [r0]\n\
  13407.    ldr r1, _08027FE0 @ =gBattleTextBuff1\n\
  13408.    movs r0, 0xFD\n\
  13409.    strb r0, [r1]\n\
  13410.    movs r0, 0x3\n\
  13411.    strb r0, [r1, 0x1]\n\
  13412.    strb r5, [r1, 0x2]\n\
  13413.    movs r0, 0xFF\n\
  13414.    strb r0, [r1, 0x3]\n\
  13415.    ldr r1, _08027FE4 @ =gBattlescriptCurrInstr\n\
  13416.    b _08028012\n\
  13417.    .align 2, 0\n\
  13418. _08027FE0: .4byte gBattleTextBuff1\n\
  13419. _08027FE4: .4byte gBattlescriptCurrInstr\n\
  13420. _08027FE8:\n\
  13421.    mov r0, r8\n\
  13422.    adds r0, 0x1\n\
  13423.    adds r0, r3\n\
  13424.    ldrb r2, [r0]\n\
  13425.    strb r2, [r4]\n\
  13426.    mov r4, r10\n\
  13427.    ldrb r0, [r4]\n\
  13428.    muls r0, r6\n\
  13429.    ldr r7, _0802801C @ =gBattleMons\n\
  13430.    adds r0, r7\n\
  13431.    adds r0, 0x22\n\
  13432.    strb r2, [r0]\n\
  13433.    ldr r1, _08028020 @ =gBattleTextBuff1\n\
  13434.    movs r0, 0xFD\n\
  13435.    strb r0, [r1]\n\
  13436.    movs r0, 0x3\n\
  13437.    strb r0, [r1, 0x1]\n\
  13438.    strb r2, [r1, 0x2]\n\
  13439.    movs r0, 0xFF\n\
  13440.    strb r0, [r1, 0x3]\n\
  13441.    mov r1, r12\n\
  13442. _08028012:\n\
  13443.    ldr r0, [r1]\n\
  13444.    adds r0, 0x5\n\
  13445.    str r0, [r1]\n\
  13446.    b _08028110\n\
  13447.    .align 2, 0\n\
  13448. _0802801C: .4byte gBattleMons\n\
  13449. _08028020: .4byte gBattleTextBuff1\n\
  13450. _08028024:\n\
  13451.    movs r4, 0\n\
  13452.    mov r8, r4\n\
  13453.    movs r7, 0x7F\n\
  13454.    mov r9, r7\n\
  13455. _0802802C:\n\
  13456.    bl Random\n\
  13457.    mov r4, r9\n\
  13458.    ands r4, r0\n\
  13459.    cmp r4, 0x70\n\
  13460.    bhi _0802802C\n\
  13461.    lsls r0, r4, 1\n\
  13462.    adds r4, r0, r4\n\
  13463.    ldr r6, _08028120 @ =gTypeEffectiveness\n\
  13464.    adds r3, r4, r6\n\
  13465.    ldr r1, _08028124 @ =gLastHitByType\n\
  13466.    ldr r2, _08028128 @ =gBankAttacker\n\
  13467.    ldrb r5, [r2]\n\
  13468.    lsls r0, r5, 1\n\
  13469.    adds r0, r1\n\
  13470.    ldrb r1, [r3]\n\
  13471.    mov r10, r2\n\
  13472.    ldrh r0, [r0]\n\
  13473.    cmp r1, r0\n\
  13474.    bne _08028088\n\
  13475.    adds r0, r4, 0x2\n\
  13476.    adds r0, r6\n\
  13477.    ldrb r0, [r0]\n\
  13478.    cmp r0, 0x5\n\
  13479.    bhi _08028088\n\
  13480.    ldr r7, _0802812C @ =gBattleMons\n\
  13481.    movs r2, 0x58\n\
  13482.    adds r0, r5, 0\n\
  13483.    muls r0, r2\n\
  13484.    adds r3, r0, r7\n\
  13485.    movs r0, 0x21\n\
  13486.    adds r0, r3\n\
  13487.    mov r12, r0\n\
  13488.    adds r0, r4, 0x1\n\
  13489.    adds r0, r6\n\
  13490.    ldrb r5, [r0]\n\
  13491.    mov r1, r12\n\
  13492.    ldrb r0, [r1]\n\
  13493.    adds r1, r5, 0\n\
  13494.    cmp r0, r1\n\
  13495.    beq _08028088\n\
  13496.    adds r0, r3, 0\n\
  13497.    adds r0, 0x22\n\
  13498.    ldrb r0, [r0]\n\
  13499.    cmp r0, r1\n\
  13500.    bne _08027FBC\n\
  13501. _08028088:\n\
  13502.    movs r7, 0x1\n\
  13503.    add r8, r7\n\
  13504.    ldr r0, _08028130 @ =0x000003e7\n\
  13505.    cmp r8, r0\n\
  13506.    ble _0802802C\n\
  13507.    movs r0, 0\n\
  13508.    mov r8, r0\n\
  13509.    ldr r1, _08028134 @ =gBattlescriptCurrInstr\n\
  13510.    mov r12, r1\n\
  13511.    ldr r3, _08028120 @ =gTypeEffectiveness\n\
  13512.    adds r0, r4, 0x1\n\
  13513.    adds r0, r3\n\
  13514.    mov r9, r0\n\
  13515.    adds r5, r3, 0\n\
  13516. _080280A4:\n\
  13517.    ldrb r1, [r5]\n\
  13518.    cmp r1, 0xFF\n\
  13519.    bgt _080280AE\n\
  13520.    cmp r1, 0xFE\n\
  13521.    bge _080280E8\n\
  13522. _080280AE:\n\
  13523.    mov r4, r10\n\
  13524.    ldrb r2, [r4]\n\
  13525.    lsls r0, r2, 1\n\
  13526.    ldr r7, _08028124 @ =gLastHitByType\n\
  13527.    adds r0, r7\n\
  13528.    ldrh r0, [r0]\n\
  13529.    cmp r1, r0\n\
  13530.    bne _080280E8\n\
  13531.    ldrb r0, [r5, 0x2]\n\
  13532.    cmp r0, 0x5\n\
  13533.    bhi _080280E8\n\
  13534.    movs r6, 0x58\n\
  13535.    adds r0, r2, 0\n\
  13536.    muls r0, r6\n\
  13537.    ldr r1, _0802812C @ =gBattleMons\n\
  13538.    adds r2, r0, r1\n\
  13539.    adds r4, r2, 0\n\
  13540.    adds r4, 0x21\n\
  13541.    ldrb r0, [r4]\n\
  13542.    mov r7, r9\n\
  13543.    ldrb r1, [r7]\n\
  13544.    cmp r0, r1\n\
  13545.    beq _080280E8\n\
  13546.    adds r0, r2, 0\n\
  13547.    adds r0, 0x22\n\
  13548.    ldrb r0, [r0]\n\
  13549.    cmp r0, r1\n\
  13550.    beq _080280E8\n\
  13551.    b _08027FE8\n\
  13552. _080280E8:\n\
  13553.    adds r5, 0x3\n\
  13554.    movs r0, 0x3\n\
  13555.    add r8, r0\n\
  13556.    ldr r0, _08028138 @ =0x0000014f\n\
  13557.    cmp r8, r0\n\
  13558.    bls _080280A4\n\
  13559.    mov r1, r12\n\
  13560.    ldr r2, [r1]\n\
  13561.    ldrb r1, [r2, 0x1]\n\
  13562.    ldrb r0, [r2, 0x2]\n\
  13563.    lsls r0, 8\n\
  13564.    orrs r1, r0\n\
  13565.    ldrb r0, [r2, 0x3]\n\
  13566.    lsls r0, 16\n\
  13567.    orrs r1, r0\n\
  13568.    ldrb r0, [r2, 0x4]\n\
  13569.    lsls r0, 24\n\
  13570.    orrs r1, r0\n\
  13571.    mov r4, r12\n\
  13572.    str r1, [r4]\n\
  13573. _08028110:\n\
  13574.    pop {r3-r5}\n\
  13575.    mov r8, r3\n\
  13576.    mov r9, r4\n\
  13577.    mov r10, r5\n\
  13578.    pop {r4-r7}\n\
  13579.    pop {r0}\n\
  13580.    bx r0\n\
  13581.    .align 2, 0\n\
  13582. _08028120: .4byte gTypeEffectiveness\n\
  13583. _08028124: .4byte gLastHitByType\n\
  13584. _08028128: .4byte gBankAttacker\n\
  13585. _0802812C: .4byte gBattleMons\n\
  13586. _08028130: .4byte 0x000003e7\n\
  13587. _08028134: .4byte gBattlescriptCurrInstr\n\
  13588. _08028138: .4byte 0x0000014f\n\
  13589.        .syntax divided");
  13590. }
  13591. #endif // NONMATCHING
  13592.  
  13593. static void atkA7_setalwayshitflag(void)
  13594. {
  13595.     gStatuses3[gBankTarget] &= ~(STATUS3_ALWAYS_HITS);
  13596.     gStatuses3[gBankTarget] |= 0x10;
  13597.     gDisableStructs[gBankTarget].bankWithSureHit = gBankAttacker;
  13598.     gBattlescriptCurrInstr++;
  13599. }
  13600.  
  13601. struct move_pp
  13602. {
  13603.     u16 move[4];
  13604.     u8 pp[4];
  13605.     u8 ppBonuses;
  13606. };
  13607.  
  13608. static void atkA8_copymovepermanently(void)
  13609. {
  13610.     gChosenMove = 0xFFFF;
  13611.     if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) && gUnknown_02024C2C[gBankTarget] != MOVE_STRUGGLE && gUnknown_02024C2C[gBankTarget] != 0 && gUnknown_02024C2C[gBankTarget] != 0xFFFF && gUnknown_02024C2C[gBankTarget] != MOVE_SKETCH)
  13612.     {
  13613.         int i;
  13614.         for (i = 0; i < 4; i++)
  13615.         {
  13616.             if (gBattleMons[gBankAttacker].moves[i] == MOVE_SKETCH)
  13617.                 continue;
  13618.             if (gBattleMons[gBankAttacker].moves[i] == gUnknown_02024C2C[gBankTarget])
  13619.                 break;
  13620.         }
  13621.         if (i != 4) //sketch fail
  13622.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13623.         else //sketch worked
  13624.         {
  13625.             struct move_pp moves_data;
  13626.             gBattleMons[gBankAttacker].moves[gCurrMovePos] = gUnknown_02024C2C[gBankTarget];
  13627.             gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gUnknown_02024C2C[gBankTarget]].pp;
  13628.             gActiveBattler = gBankAttacker;
  13629.             for (i = 0; i < 4; i++)
  13630.             {
  13631.                 moves_data.move[i] = gBattleMons[gBankAttacker].moves[i];
  13632.                 moves_data.pp[i] = gBattleMons[gBankAttacker].pp[i];
  13633.             }
  13634.             moves_data.ppBonuses = gBattleMons[gBankAttacker].ppBonuses;
  13635.             EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data);
  13636.             MarkBufferBankForExecution(gActiveBattler);
  13637.             gBattleTextBuff1[0] = 0xFD;
  13638.             gBattleTextBuff1[1] = 2;
  13639.             gBattleTextBuff1[2] = gUnknown_02024C2C[gBankTarget];
  13640.             gBattleTextBuff1[3] = gUnknown_02024C2C[gBankTarget] >> 8;
  13641.             gBattleTextBuff1[4] = 0xFF;
  13642.             gBattlescriptCurrInstr += 5;
  13643.         }
  13644.     }
  13645.     else //sketch fail
  13646.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13647. }
  13648.  
  13649. static bool8 IsTwoTurnsMove(u16 move)
  13650. {
  13651.     u8 effect = gBattleMoves[move].effect;
  13652.     if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE)
  13653.         return 1;
  13654.     else
  13655.         return 0;
  13656. }
  13657.  
  13658. static bool8 IsMoveUnchoosable(u16 move)
  13659. {
  13660.     if (move == 0 || move == MOVE_SLEEP_TALK || move == MOVE_ASSIST || move == MOVE_MIRROR_MOVE || move == MOVE_METRONOME)
  13661.         return 1;
  13662.     else
  13663.         return 0;
  13664. }
  13665.  
  13666. static u8 AttacksThisTurn(u8 bank, u16 move) //Note: returns 1 if it's a charging turn, otherwise 2
  13667. {
  13668.     //first argument is unused
  13669.     u8 effect;
  13670.     if (gBattleMoves[move].effect == EFFECT_SOLARBEAM && (gBattleWeather & WEATHER_SUN_ANY))
  13671.         return 2;
  13672.     effect = gBattleMoves[move].effect;
  13673.     if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE)
  13674.     {
  13675.         if ((gHitMarker & HITMARKER_x8000000))
  13676.             return 1;
  13677.     }
  13678.     return 2;
  13679. }
  13680.  
  13681. static void atkA9_trychoosesleeptalkmove(void)
  13682. {
  13683.     u8 unusable_moves = 0;
  13684.     int i;
  13685.  
  13686.     for (i = 0; i < 4; i++)
  13687.     {
  13688.         if (IsMoveUnchoosable(gBattleMons[gBankAttacker].moves[i]) || gBattleMons[gBankAttacker].moves[i] == MOVE_FOCUS_PUNCH
  13689.             || gBattleMons[gBankAttacker].moves[i] == MOVE_UPROAR || IsTwoTurnsMove(gBattleMons[gBankAttacker].moves[i]))
  13690.                 unusable_moves |= gBitTable[i];
  13691.     }
  13692.     unusable_moves = CheckMoveLimitations(gBankAttacker, unusable_moves, 0xFD);
  13693.     if (unusable_moves == 0xF) //all 4 moves cannot be chosen
  13694.         gBattlescriptCurrInstr += 5;
  13695.     else //at least one move can be chosen
  13696.     {
  13697.         u32 random_pos;
  13698.         do
  13699.         {
  13700.             random_pos = Random() & 3;
  13701.         } while ((gBitTable[random_pos] & unusable_moves));
  13702.  
  13703.         gRandomMove = gBattleMons[gBankAttacker].moves[random_pos];
  13704.         gCurrMovePos = random_pos;
  13705.         gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  13706.         gBankTarget = GetMoveTarget(gRandomMove, 0);
  13707.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13708.     }
  13709. }
  13710.  
  13711. static void atkAA_setdestinybond(void)
  13712. {
  13713.     gBattleMons[gBankAttacker].status2 |= STATUS2_DESTINY_BOND;
  13714.     gBattlescriptCurrInstr++;
  13715. }
  13716.  
  13717. static void TrySetDestinyBondToHappen(void)
  13718. {
  13719.     u8 atk_side = GetBattlerSide(gBankAttacker);
  13720.     u8 def_side = GetBattlerSide(gBankTarget);
  13721.     if (gBattleMons[gBankTarget].status2 & STATUS2_DESTINY_BOND && atk_side != def_side && !(gHitMarker & HITMARKER_GRUDGE))
  13722.         gHitMarker |= HITMARKER_DESTINYBOND;
  13723. }
  13724.  
  13725. static void atkAB_trysetdestinybondtohappen(void)
  13726. {
  13727.     TrySetDestinyBondToHappen();
  13728.     gBattlescriptCurrInstr++;
  13729. }
  13730.  
  13731. static void atkAC_remaininghptopower(void)
  13732. {
  13733.     s32 hp_fraction = GetScaledHPFraction(gBattleMons[gBankAttacker].hp, gBattleMons[gBankAttacker].maxHP, 48);
  13734.     int i;
  13735.     for (i = 0; i < 12; i += 2)
  13736.     {
  13737.         if (hp_fraction <= sFlailHpScaleToPowerTable[i])
  13738.             break;
  13739.     }
  13740.     gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1];
  13741.     gBattlescriptCurrInstr++;
  13742. }
  13743.  
  13744. static void atkAD_tryspiteppreduce(void)
  13745. {
  13746.     if (gLastUsedMove[gBankTarget] != 0 && gLastUsedMove[gBankTarget] != 0xFFFF && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE))
  13747.     {
  13748.         int i;
  13749.         for (i = 0; i < 4; i++)
  13750.         {
  13751.             if (gLastUsedMove[gBankTarget] == gBattleMons[gBankTarget].moves[i])
  13752.                 break;
  13753.         }
  13754.         if (i != 4 && gBattleMons[gBankTarget].pp[i] > 1)
  13755.         {
  13756.             s32 lost_pp = (Random() & 3) + 2;
  13757.             if (gBattleMons[gBankTarget].pp[i] < lost_pp)
  13758.                 lost_pp = gBattleMons[gBankTarget].pp[i];
  13759.  
  13760.             gBattleTextBuff1[0] = 0xFD;
  13761.             gBattleTextBuff1[1] = 2;
  13762.             gBattleTextBuff1[2] = gLastUsedMove[gBankTarget];
  13763.             gBattleTextBuff1[3] = gLastUsedMove[gBankTarget] >> 8;
  13764.             gBattleTextBuff1[4] = 0xFF;
  13765.             ConvertIntToDecimalStringN(gBattleTextBuff2, lost_pp, 0, 1);
  13766.             gBattleTextBuff2[0] = 0xFD;
  13767.             gBattleTextBuff2[1] = 1;
  13768.             gBattleTextBuff2[2] = 1;
  13769.             gBattleTextBuff2[3] = 1;
  13770.             gBattleTextBuff2[4] = lost_pp;
  13771.             gBattleTextBuff2[5] = 0xFF;
  13772.  
  13773.             gBattleMons[gBankTarget].pp[i] -= lost_pp;
  13774.             gActiveBattler = gBankTarget;
  13775.             if (!(gDisableStructs[gActiveBattler].unk18_b & gBitTable[i])
  13776.                 && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))
  13777.             {
  13778.                 EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]);
  13779.                 MarkBufferBankForExecution(gActiveBattler);
  13780.             }
  13781.             gBattlescriptCurrInstr += 5;
  13782.             if (gBattleMons[gBankTarget].pp[i] == 0)
  13783.                 CancelMultiTurnMoves(gBankTarget);
  13784.             return;
  13785.         }
  13786.     }
  13787.     gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13788. }
  13789.  
  13790. static void atkAE_healpartystatus(void)
  13791. {
  13792.     register u32 zero2 asm("r4") = 0;
  13793.     u32 zero = zero2;
  13794.     u8 to_heal = 0;
  13795.     if (gCurrentMove == MOVE_HEAL_BELL)
  13796.     {
  13797.         struct Pokemon* party;
  13798.         int i;
  13799.  
  13800.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  13801.         if (GetBattlerSide(gBankAttacker) == 0)
  13802.             party = gPlayerParty;
  13803.         else
  13804.             party = gEnemyParty;
  13805.  
  13806.         if (gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF)
  13807.         {
  13808.             gBattleMons[gBankAttacker].status1 = 0;
  13809.         }
  13810.         else
  13811.         {
  13812.             RecordAbilityBattle(gBankAttacker, gBattleMons[gBankAttacker].ability);
  13813.             gBattleCommunication[MULTISTRING_CHOOSER] |= 1;
  13814.         }
  13815.  
  13816.         gActiveBattler = gBattleStruct->scriptingActive = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2);
  13817.         if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
  13818.         {
  13819.             if (gBattleMons[gActiveBattler].ability != ABILITY_SOUNDPROOF)
  13820.             {
  13821.                 gBattleMons[gActiveBattler].status1 = 0;
  13822.             }
  13823.             else
  13824.             {
  13825.                 RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);
  13826.                 gBattleCommunication[MULTISTRING_CHOOSER] |= 2;
  13827.             }
  13828.         }
  13829.  
  13830.         for (i = 0; i < 6; i++)
  13831.         {
  13832.             u16 species = GetMonData(&party[i], MON_DATA_SPECIES2);
  13833.             u8 abilityBit = GetMonData(&party[i], MON_DATA_ALT_ABILITY);
  13834.             if (species != 0 && species != SPECIES_EGG)
  13835.             {
  13836.                 u8 ability;
  13837.                 if (gBattlerPartyIndexes[gBankAttacker] == i)
  13838.                     ability = gBattleMons[gBankAttacker].ability;
  13839.                 else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[gActiveBattler] == i && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
  13840.                     ability = gBattleMons[gActiveBattler].ability;
  13841.                 else
  13842.                     ability = GetAbilityBySpecies(species, abilityBit);
  13843.                 if (ability != ABILITY_SOUNDPROOF)
  13844.                     to_heal |= (1 << i);
  13845.             }
  13846.         }
  13847.     }
  13848.     else //Aromatherapy
  13849.     {
  13850.         gBattleCommunication[MULTISTRING_CHOOSER] = 4;
  13851.         to_heal = 0x3F;
  13852.         gBattleMons[gBankAttacker].status1 = zero2;
  13853.  
  13854.         gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2);
  13855.         if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
  13856.             gBattleMons[gActiveBattler].status1 = 0;
  13857.  
  13858.     }
  13859.     //missing check?
  13860.     gActiveBattler = gBankAttacker;
  13861.     EmitSetMonData(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero);
  13862.     MarkBufferBankForExecution(gActiveBattler);
  13863.  
  13864.     gBattlescriptCurrInstr++;
  13865. }
  13866.  
  13867. static void atkAF_cursetarget(void)
  13868. {
  13869.     if (gBattleMons[gBankTarget].status2 & STATUS2_CURSED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)
  13870.     {
  13871.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13872.     }
  13873.     else
  13874.     {
  13875.         gBattleMons[gBankTarget].status2 |= STATUS2_CURSED;
  13876.         gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2;
  13877.         if (gBattleMoveDamage == 0)
  13878.             gBattleMoveDamage = 1;
  13879.         gBattlescriptCurrInstr += 5;
  13880.     }
  13881. }
  13882.  
  13883. static void atkB0_trysetspikes(void)
  13884. {
  13885.     u8 side = GetBattlerSide(gBankAttacker) ^ 1;
  13886.     if (gSideTimers[side].spikesAmount == 3)
  13887.     {
  13888.         gSpecialStatuses[gBankAttacker].flag20 = 1;
  13889.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13890.     }
  13891.     else
  13892.     {
  13893.         gSideAffecting[side] |= SIDE_STATUS_SPIKES;
  13894.         gSideTimers[side].spikesAmount++;
  13895.         gBattlescriptCurrInstr += 5;
  13896.     }
  13897. }
  13898.  
  13899. static void atkB1_setforesight(void)
  13900. {
  13901.     gBattleMons[gBankTarget].status2 |= STATUS2_FORESIGHT;
  13902.     gBattlescriptCurrInstr++;
  13903. }
  13904.  
  13905. static void atkB2_trysetperishsong(void)
  13906. {
  13907.     int not_affected_pokes = 0, i;
  13908.  
  13909.     for (i = 0; i < gBattlersCount; i++)
  13910.     {
  13911.         if (gStatuses3[i] & STATUS3_PERISH_SONG || gBattleMons[i].ability == ABILITY_SOUNDPROOF)
  13912.             not_affected_pokes++;
  13913.         else
  13914.         {
  13915.             gStatuses3[i] |= STATUS3_PERISH_SONG;
  13916.             gDisableStructs[i].perishSongTimer1 = 3;
  13917.             gDisableStructs[i].perishSongTimer2 = 3;
  13918.         }
  13919.     }
  13920.  
  13921.     PressurePPLoseOnUsingPerishSong(gBankAttacker);
  13922.     if (not_affected_pokes == gBattlersCount)
  13923.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  13924.     else
  13925.         gBattlescriptCurrInstr += 5;
  13926. }
  13927.  
  13928. static void atkB3_rolloutdamagecalculation(void)
  13929. {
  13930.     if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
  13931.     {
  13932.         CancelMultiTurnMoves(gBankAttacker);
  13933.         gBattlescriptCurrInstr = BattleScript_MoveMissedPause;
  13934.     }
  13935.     else
  13936.     {
  13937.         int i;
  13938.         if (!(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) //first hit
  13939.         {
  13940.             gDisableStructs[gBankAttacker].rolloutTimer1 = 5;
  13941.             gDisableStructs[gBankAttacker].rolloutTimer2 = 5;
  13942.             gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS;
  13943.             gLockedMoves[gBankAttacker] = gCurrentMove;
  13944.         }
  13945.         if (--gDisableStructs[gBankAttacker].rolloutTimer1 == 0)
  13946.             gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
  13947.  
  13948.         gDynamicBasePower = gBattleMoves[gCurrentMove].power;
  13949.         for (i = 1; i < (5 - gDisableStructs[gBankAttacker].rolloutTimer1); i++)
  13950.             gDynamicBasePower *= 2;
  13951.  
  13952.         if (gBattleMons[gBankAttacker].status2 & STATUS2_DEFENSE_CURL)
  13953.             gDynamicBasePower *= 2;
  13954.  
  13955.         gBattlescriptCurrInstr++;
  13956.     }
  13957. }
  13958.  
  13959. static void atkB4_jumpifconfusedandstatmaxed(void)
  13960. {
  13961.     if (gBattleMons[gBankTarget].status2 & STATUS2_CONFUSION && gBattleMons[gBankTarget].statStages[T2_READ_8(gBattlescriptCurrInstr + 1)] == 0xC)
  13962.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  13963.     else
  13964.         gBattlescriptCurrInstr += 6;
  13965. }
  13966.  
  13967. static void atkB5_furycuttercalc(void)
  13968. {
  13969.     if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
  13970.     {
  13971.         gDisableStructs[gBankAttacker].furyCutterCounter = 0;
  13972.         gBattlescriptCurrInstr = BattleScript_MoveMissedPause;
  13973.     }
  13974.     else
  13975.     {
  13976.         int i;
  13977.  
  13978.         if (gDisableStructs[gBankAttacker].furyCutterCounter != 5)
  13979.             gDisableStructs[gBankAttacker].furyCutterCounter++;
  13980.  
  13981.         gDynamicBasePower = gBattleMoves[gCurrentMove].power;
  13982.         for (i = 1; i < gDisableStructs[gBankAttacker].furyCutterCounter; i++)
  13983.             gDynamicBasePower *= 2;
  13984.  
  13985.         gBattlescriptCurrInstr++;
  13986.     }
  13987. }
  13988.  
  13989. static void atkB6_happinesstodamagecalculation(void)
  13990. {
  13991.     if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN)
  13992.         gDynamicBasePower = 10 * (gBattleMons[gBankAttacker].friendship) / 25;
  13993.     else //EFFECT_FRUSTRATION
  13994.         gDynamicBasePower = 10 * (255 - gBattleMons[gBankAttacker].friendship) / 25;
  13995.     gBattlescriptCurrInstr++;
  13996. }
  13997.  
  13998. static void atkB7_presentdamagecalculation(void)
  13999. {
  14000.     s32 rand = Random() & 0xFF;
  14001.     if (rand < 102)
  14002.         gDynamicBasePower = 40;
  14003.     else if (rand < 178)
  14004.         gDynamicBasePower = 80;
  14005.     else if (rand < 204)
  14006.         gDynamicBasePower = 120;
  14007.     else
  14008.     {
  14009.         gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 4;
  14010.         if (gBattleMoveDamage == 0)
  14011.             gBattleMoveDamage = 1;
  14012.         gBattleMoveDamage *= -1;
  14013.     }
  14014.     if (rand < 204)
  14015.         gBattlescriptCurrInstr = BattleScript_HitFromCritCalc;
  14016.     else if (gBattleMons[gBankTarget].maxHP == gBattleMons[gBankTarget].hp)
  14017.         gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp;
  14018.     else
  14019.     {
  14020.         //gMoveResultFlags &= ~(MOVE_RESULT_DOESNT_AFFECT_FOE); only in Emerald
  14021.         gBattlescriptCurrInstr = BattleScript_PresentHealTarget;
  14022.     }
  14023. }
  14024.  
  14025. static void atkB8_setsafeguard(void)
  14026. {
  14027.     if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_SAFEGUARD)
  14028.     {
  14029.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  14030.         gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  14031.     }
  14032.     else
  14033.     {
  14034.         gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_SAFEGUARD;
  14035.         gSideTimers[GetBattlerPosition(gBankAttacker) & 1].safeguardTimer = 5;
  14036.         gBattleCommunication[MULTISTRING_CHOOSER] = 5;
  14037.     }
  14038.     gBattlescriptCurrInstr++;
  14039. }
  14040.  
  14041. static void atkB9_magnitudedamagecalculation(void)
  14042. {
  14043.     s32 magnitude = Random() % 100;
  14044.     if (magnitude < 5)
  14045.     {
  14046.         gDynamicBasePower = 10;
  14047.         magnitude = 4;
  14048.     }
  14049.     else if (magnitude < 15)
  14050.     {
  14051.         gDynamicBasePower = 30;
  14052.         magnitude = 5;
  14053.     }
  14054.     else if (magnitude < 35)
  14055.     {
  14056.         gDynamicBasePower = 50;
  14057.         magnitude = 6;
  14058.     }
  14059.     else if (magnitude < 65)
  14060.     {
  14061.         gDynamicBasePower = 70;
  14062.         magnitude = 7;
  14063.     }
  14064.     else if (magnitude < 85)
  14065.     {
  14066.         gDynamicBasePower = 90;
  14067.         magnitude = 8;
  14068.     }
  14069.     else if (magnitude < 95)
  14070.     {
  14071.         gDynamicBasePower = 110;
  14072.         magnitude = 9;
  14073.     }
  14074.     else
  14075.     {
  14076.         gDynamicBasePower = 150;
  14077.         magnitude = 10;
  14078.     }
  14079.  
  14080.     gBattleTextBuff1[0] = 0xFD;
  14081.     gBattleTextBuff1[1] = 1;
  14082.     gBattleTextBuff1[2] = 1;
  14083.     gBattleTextBuff1[3] = 2;
  14084.     gBattleTextBuff1[4] = magnitude;
  14085.     gBattleTextBuff1[5] = 0xFF;
  14086.  
  14087.     for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++)
  14088.     {
  14089.         if (gBankTarget == gBankAttacker)
  14090.             continue;
  14091.         if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) //a valid target was found
  14092.             break;
  14093.     }
  14094.     gBattlescriptCurrInstr++;
  14095. }
  14096.  
  14097. static void atkBA_jumpifnopursuitswitchdmg(void)
  14098. {
  14099.     if (gMultiHitCounter == 1)
  14100.     {
  14101.         if (GetBattlerSide(gBankAttacker) == 0)
  14102.             gBankTarget = GetBattlerAtPosition(1);
  14103.         else
  14104.             gBankTarget = GetBattlerAtPosition(0);
  14105.     }
  14106.     else
  14107.     {
  14108.         if (GetBattlerSide(gBankAttacker) == 0)
  14109.             gBankTarget = GetBattlerAtPosition(3);
  14110.         else
  14111.             gBankTarget = GetBattlerAtPosition(2);
  14112.     }
  14113.  
  14114.     if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram16010arr(gBankTarget) && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE))
  14115.         && gBattleMons[gBankAttacker].hp && !gDisableStructs[gBankTarget].truantCounter && gChosenMovesByBanks[gBankTarget] == MOVE_PURSUIT)
  14116.     {
  14117.         int i;
  14118.         for (i = 0; i < gBattlersCount; i++)
  14119.         {
  14120.             if (gBanksByTurnOrder[i] == gBankTarget)
  14121.                 gActionsByTurnOrder[i] = 11;
  14122.         }
  14123.         gCurrentMove = MOVE_PURSUIT;
  14124.         gBattlescriptCurrInstr += 5;
  14125.         gBattleStruct->animTurn = 1;
  14126.         gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  14127.     }
  14128.     else
  14129.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14130. }
  14131.  
  14132. static void atkBB_setsunny(void)
  14133. {
  14134.     if (gBattleWeather & WEATHER_SUN_ANY)
  14135.     {
  14136.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  14137.         gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  14138.     }
  14139.     else
  14140.     {
  14141.         gBattleWeather = WEATHER_SUN_TEMPORARY;
  14142.         gBattleCommunication[MULTISTRING_CHOOSER] = 4;
  14143.         gWishFutureKnock.weatherDuration = 5;
  14144.     }
  14145.     gBattlescriptCurrInstr++;
  14146. }
  14147.  
  14148. static void atkBC_maxattackhalvehp(void) //belly drum
  14149. {
  14150.     u32 half_hp = gBattleMons[gBankAttacker].maxHP / 2;
  14151.     if (!(gBattleMons[gBankAttacker].maxHP / 2))
  14152.         half_hp = 1;
  14153.  
  14154.     if (gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] < 12 && gBattleMons[gBankAttacker].hp > half_hp)
  14155.     {
  14156.         gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] = 12;
  14157.         gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2;
  14158.         if (gBattleMoveDamage == 0)
  14159.             gBattleMoveDamage = 1;
  14160.         gBattlescriptCurrInstr += 5;
  14161.     }
  14162.     else
  14163.     {
  14164.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14165.     }
  14166. }
  14167.  
  14168. static void atkBD_copyfoestats(void) //psych up
  14169. {
  14170.     int i;
  14171.     for (i = 0; i < 8; i++)
  14172.     {
  14173.         gBattleMons[gBankAttacker].statStages[i] = gBattleMons[gBankTarget].statStages[i];
  14174.     }
  14175.     gBattlescriptCurrInstr += 5; //why not 1? possible unused fail possibility?
  14176. }
  14177.  
  14178. static void atkBE_rapidspinfree(void) //rapid spin
  14179. {
  14180.     if (gBattleMons[gBankAttacker].status2 & STATUS2_WRAPPED)
  14181.     {
  14182.         gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED);
  14183.         gBankTarget = ewram16020arr(gBankAttacker);
  14184.         gBattleTextBuff1[0] = 0xFD;
  14185.         gBattleTextBuff1[1] = 2;
  14186.         gBattleTextBuff1[2] = ewram16004arr(0, gBankAttacker);
  14187.         gBattleTextBuff1[3] = ewram16004arr(1, gBankAttacker);
  14188.         gBattleTextBuff1[4] = 0xFF;
  14189.         BattleScriptPushCursor();
  14190.         gBattlescriptCurrInstr = BattleScript_WrapFree;
  14191.     }
  14192.     else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED)
  14193.     {
  14194.         gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED);
  14195.         gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK);
  14196.         BattleScriptPushCursor();
  14197.         gBattlescriptCurrInstr = BattleScript_LeechSeedFree;
  14198.     }
  14199.     else if (gSideAffecting[GetBattlerSide(gBankAttacker)] & SIDE_STATUS_SPIKES)
  14200.     {
  14201.         gSideAffecting[GetBattlerSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES);
  14202.         gSideTimers[GetBattlerSide(gBankAttacker)].spikesAmount = 0;
  14203.         BattleScriptPushCursor();
  14204.         gBattlescriptCurrInstr = BattleScript_SpikesFree;
  14205.     }
  14206.     else
  14207.         gBattlescriptCurrInstr++;
  14208. }
  14209.  
  14210. static void atkBF_setdefensecurlbit(void)
  14211. {
  14212.     gBattleMons[gBankAttacker].status2 |= STATUS2_DEFENSE_CURL;
  14213.     gBattlescriptCurrInstr++;
  14214. }
  14215.  
  14216. static void atkC0_recoverbasedonsunlight(void)
  14217. {
  14218.     gBankTarget = gBankAttacker;
  14219.     if (gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP)
  14220.     {
  14221.         if (!gBattleWeather || !WEATHER_HAS_EFFECT)
  14222.             gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2;
  14223.         else if (gBattleWeather & WEATHER_SUN_ANY)
  14224.             gBattleMoveDamage = 20 * gBattleMons[gBankAttacker].maxHP / 30;
  14225.         else //not sunny weather
  14226.             gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4;
  14227.         if (gBattleMoveDamage == 0)
  14228.             gBattleMoveDamage = 1;
  14229.         gBattleMoveDamage *= -1;
  14230.         gBattlescriptCurrInstr += 5;
  14231.     }
  14232.     else
  14233.     {
  14234.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14235.     }
  14236. }
  14237.  
  14238. static void atkC1_hiddenpowercalc(void)
  14239. {
  14240.     u8 power = ((gBattleMons[gBankAttacker].hpIV & 2) >> 1) |
  14241.                ((gBattleMons[gBankAttacker].attackIV & 2)) |
  14242.                ((gBattleMons[gBankAttacker].defenseIV & 2) << 1) |
  14243.                ((gBattleMons[gBankAttacker].speedIV & 2) << 2) |
  14244.                ((gBattleMons[gBankAttacker].spAttackIV & 2) << 3) |
  14245.                ((gBattleMons[gBankAttacker].spDefenseIV & 2) << 4);
  14246.     u8 type = ((gBattleMons[gBankAttacker].hpIV & 1)) |
  14247.               ((gBattleMons[gBankAttacker].attackIV & 1) << 1) |
  14248.               ((gBattleMons[gBankAttacker].defenseIV & 1) << 2) |
  14249.               ((gBattleMons[gBankAttacker].speedIV & 1) << 3) |
  14250.               ((gBattleMons[gBankAttacker].spAttackIV & 1) << 4) |
  14251.               ((gBattleMons[gBankAttacker].spDefenseIV & 1) << 5);
  14252.    
  14253.     gDynamicBasePower = 30 + (power * 40 / 63);
  14254.    
  14255.     gBattleStruct->dynamicMoveType = ((type * 15) / 63) + 1;
  14256.     if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY)
  14257.         gBattleStruct->dynamicMoveType++;
  14258.    
  14259.     gBattleStruct->dynamicMoveType |= 0xC0;
  14260.    
  14261.     gBattlescriptCurrInstr++;
  14262. }
  14263.  
  14264. static void atkC2_selectfirstvalidtarget(void)
  14265. {
  14266.     for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++)
  14267.     {
  14268.         if (gBankTarget == gBankAttacker)
  14269.             continue;
  14270.         if (!(gAbsentBattlerFlags & gBitTable[gBankTarget]))
  14271.             break;
  14272.     }
  14273.     gBattlescriptCurrInstr++;
  14274. }
  14275.  
  14276. static void atkC3_trysetfutureattack(void)
  14277. {
  14278.     if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0)
  14279.     {
  14280.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14281.     }
  14282.     else
  14283.     {
  14284.         gWishFutureKnock.futureSightMove[gBankTarget] = gCurrentMove;
  14285.         gWishFutureKnock.futureSightAttacker[gBankTarget] = gBankAttacker;
  14286.         gWishFutureKnock.futureSightCounter[gBankTarget] = 3;
  14287.         gWishFutureKnock.futureSightDmg[gBankTarget] = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove,
  14288.                                                     gSideAffecting[GetBattlerPosition(gBankTarget) & 1], 0,
  14289.                                                     0, gBankAttacker, gBankTarget);
  14290.  
  14291.         if (gProtectStructs[gBankAttacker].helpingHand)
  14292.             gWishFutureKnock.futureSightDmg[gBankTarget] = gWishFutureKnock.futureSightDmg[gBankTarget] * 15 / 10;
  14293.  
  14294.         if (gCurrentMove == MOVE_DOOM_DESIRE)
  14295.             gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  14296.         else
  14297.             gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  14298.  
  14299.         gBattlescriptCurrInstr += 5;
  14300.     }
  14301. }
  14302.  
  14303. #ifdef NONMATCHING
  14304. static void atkC4_trydobeatup(void)
  14305. {
  14306.     register struct Pokemon* party asm("r7");
  14307.     if (GetBattlerSide(gBankAttacker) == 0)
  14308.         party = gPlayerParty;
  14309.     else
  14310.         party = gEnemyParty;
  14311.  
  14312.     if (gBattleMons[gBankTarget].hp == 0)
  14313.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14314.     else
  14315.     {
  14316.         while (gBattleCommunication[0] < 6)
  14317.         {
  14318.             if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2)
  14319.                 && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS))
  14320.                     break;
  14321.             gBattleCommunication[0]++;
  14322.         }
  14323.         if (gBattleCommunication[0] < 6)
  14324.         {
  14325.             gBattleTextBuff1[0] = 0xFD;
  14326.             gBattleTextBuff1[1] = 4;
  14327.             gBattleTextBuff1[2] = gBankAttacker;
  14328.             gBattleTextBuff1[3] = gBattleCommunication[0];
  14329.             gBattleTextBuff1[4] = 0xFF;
  14330.             gBattlescriptCurrInstr += 9;
  14331.  
  14332.             gBattleMoveDamage = gBaseStats[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack;
  14333.             gBattleMoveDamage *= gBattleMoves[gCurrentMove].power;
  14334.             gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2);
  14335.             gBattleMoveDamage /= gBaseStats[gBattleMons[gBankTarget].species].baseDefense;
  14336.             gBattleMoveDamage = (gBattleMoveDamage / 50) + 2;
  14337.             if (gProtectStructs[gBankAttacker].helpingHand)
  14338.                 gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
  14339.  
  14340.             gBattleCommunication[0]++;
  14341.         }
  14342.         else if (gBattleCommunication[0] != 0)
  14343.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14344.         else
  14345.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5);
  14346.     }
  14347. }
  14348. #else
  14349. NAKED
  14350. static void atkC4_trydobeatup(void)
  14351. {
  14352.     asm(".syntax unified\n\
  14353.    push {r4-r7,lr}\n\
  14354.    mov r7, r9\n\
  14355.    mov r6, r8\n\
  14356.    push {r6,r7}\n\
  14357.    ldr r0, _08029A8C @ =gBankAttacker\n\
  14358.    ldrb r0, [r0]\n\
  14359.    bl GetBattlerSide\n\
  14360.    lsls r0, 24\n\
  14361.    ldr r7, _08029A90 @ =gEnemyParty\n\
  14362.    cmp r0, 0\n\
  14363.    bne _08029A62\n\
  14364.    ldr r7, _08029A94 @ =gPlayerParty\n\
  14365. _08029A62:\n\
  14366.    ldr r2, _08029A98 @ =gBattleMons\n\
  14367.    ldr r0, _08029A9C @ =gBankTarget\n\
  14368.    ldrb r1, [r0]\n\
  14369.    movs r0, 0x58\n\
  14370.    muls r0, r1\n\
  14371.    adds r0, r2\n\
  14372.    ldrh r0, [r0, 0x28]\n\
  14373.    cmp r0, 0\n\
  14374.    bne _08029AA4\n\
  14375.    ldr r3, _08029AA0 @ =gBattlescriptCurrInstr\n\
  14376.    ldr r2, [r3]\n\
  14377.    ldrb r1, [r2, 0x1]\n\
  14378.    ldrb r0, [r2, 0x2]\n\
  14379.    lsls r0, 8\n\
  14380.    orrs r1, r0\n\
  14381.    ldrb r0, [r2, 0x3]\n\
  14382.    lsls r0, 16\n\
  14383.    orrs r1, r0\n\
  14384.    ldrb r0, [r2, 0x4]\n\
  14385.    b _08029C40\n\
  14386.    .align 2, 0\n\
  14387. _08029A8C: .4byte gBankAttacker\n\
  14388. _08029A90: .4byte gEnemyParty\n\
  14389. _08029A94: .4byte gPlayerParty\n\
  14390. _08029A98: .4byte gBattleMons\n\
  14391. _08029A9C: .4byte gBankTarget\n\
  14392. _08029AA0: .4byte gBattlescriptCurrInstr\n\
  14393. _08029AA4:\n\
  14394.    ldr r6, _08029BE0 @ =gBattleCommunication\n\
  14395.    ldrb r0, [r6]\n\
  14396.    mov r8, r0\n\
  14397.    cmp r0, 0x5\n\
  14398.    bls _08029AB0\n\
  14399.    b _08029C0C\n\
  14400. _08029AB0:\n\
  14401.    adds r4, r6, 0\n\
  14402.    movs r5, 0x64\n\
  14403. _08029AB4:\n\
  14404.    ldrb r0, [r4]\n\
  14405.    muls r0, r5\n\
  14406.    adds r0, r7, r0\n\
  14407.    movs r1, 0x39\n\
  14408.    bl GetMonData\n\
  14409.    cmp r0, 0\n\
  14410.    beq _08029AF8\n\
  14411.    ldrb r0, [r6]\n\
  14412.    muls r0, r5\n\
  14413.    adds r0, r7, r0\n\
  14414.    movs r1, 0x41\n\
  14415.    bl GetMonData\n\
  14416.    cmp r0, 0\n\
  14417.    beq _08029AF8\n\
  14418.    ldrb r0, [r4]\n\
  14419.    muls r0, r5\n\
  14420.    adds r0, r7, r0\n\
  14421.    movs r1, 0x41\n\
  14422.    bl GetMonData\n\
  14423.    movs r1, 0xCE\n\
  14424.    lsls r1, 1\n\
  14425.    cmp r0, r1\n\
  14426.    beq _08029AF8\n\
  14427.    ldrb r0, [r4]\n\
  14428.    muls r0, r5\n\
  14429.    adds r0, r7, r0\n\
  14430.    movs r1, 0x37\n\
  14431.    bl GetMonData\n\
  14432.    cmp r0, 0\n\
  14433.    beq _08029B08\n\
  14434. _08029AF8:\n\
  14435.    ldrb r0, [r4]\n\
  14436.    adds r0, 0x1\n\
  14437.    strb r0, [r4]\n\
  14438.    adds r6, r4, 0\n\
  14439.    lsls r0, 24\n\
  14440.    lsrs r0, 24\n\
  14441.    cmp r0, 0x5\n\
  14442.    bls _08029AB4\n\
  14443. _08029B08:\n\
  14444.    ldr r1, _08029BE0 @ =gBattleCommunication\n\
  14445.    mov r9, r1\n\
  14446.    ldrb r2, [r1]\n\
  14447.    cmp r2, 0x5\n\
  14448.    bhi _08029C0C\n\
  14449.    ldr r1, _08029BE4 @ =gBattleTextBuff1\n\
  14450.    movs r0, 0xFD\n\
  14451.    strb r0, [r1]\n\
  14452.    movs r0, 0x4\n\
  14453.    strb r0, [r1, 0x1]\n\
  14454.    ldr r6, _08029BE8 @ =gBankAttacker\n\
  14455.    ldrb r0, [r6]\n\
  14456.    strb r0, [r1, 0x2]\n\
  14457.    strb r2, [r1, 0x3]\n\
  14458.    movs r0, 0xFF\n\
  14459.    strb r0, [r1, 0x4]\n\
  14460.    ldr r1, _08029BEC @ =gBattlescriptCurrInstr\n\
  14461.    ldr r0, [r1]\n\
  14462.    adds r0, 0x9\n\
  14463.    str r0, [r1]\n\
  14464.    ldr r2, _08029BF0 @ =gBattleMoveDamage\n\
  14465.    mov r8, r2\n\
  14466.    ldr r5, _08029BF4 @ =gBaseStats\n\
  14467.    mov r1, r9\n\
  14468.    ldrb r0, [r1]\n\
  14469.    movs r4, 0x64\n\
  14470.    muls r0, r4\n\
  14471.    adds r0, r7, r0\n\
  14472.    movs r1, 0xB\n\
  14473.    bl GetMonData\n\
  14474.    lsls r1, r0, 3\n\
  14475.    subs r1, r0\n\
  14476.    lsls r1, 2\n\
  14477.    adds r1, r5\n\
  14478.    ldrb r3, [r1, 0x1]\n\
  14479.    mov r2, r8\n\
  14480.    str r3, [r2]\n\
  14481.    ldr r2, _08029BF8 @ =gBattleMoves\n\
  14482.    ldr r0, _08029BFC @ =gCurrentMove\n\
  14483.    ldrh r1, [r0]\n\
  14484.    lsls r0, r1, 1\n\
  14485.    adds r0, r1\n\
  14486.    lsls r0, 2\n\
  14487.    adds r0, r2\n\
  14488.    ldrb r0, [r0, 0x1]\n\
  14489.    muls r0, r3\n\
  14490.    mov r1, r8\n\
  14491.    str r0, [r1]\n\
  14492.    mov r2, r9\n\
  14493.    ldrb r0, [r2]\n\
  14494.    muls r0, r4\n\
  14495.    adds r0, r7, r0\n\
  14496.    movs r1, 0x38\n\
  14497.    bl GetMonData\n\
  14498.    lsls r0, 1\n\
  14499.    movs r1, 0x5\n\
  14500.    bl __udivsi3\n\
  14501.    adds r0, 0x2\n\
  14502.    mov r2, r8\n\
  14503.    ldr r1, [r2]\n\
  14504.    muls r0, r1\n\
  14505.    str r0, [r2]\n\
  14506.    ldr r3, _08029C00 @ =gBattleMons\n\
  14507.    ldr r1, _08029C04 @ =gBankTarget\n\
  14508.    ldrb r2, [r1]\n\
  14509.    movs r1, 0x58\n\
  14510.    muls r1, r2\n\
  14511.    adds r1, r3\n\
  14512.    ldrh r2, [r1]\n\
  14513.    lsls r1, r2, 3\n\
  14514.    subs r1, r2\n\
  14515.    lsls r1, 2\n\
  14516.    adds r1, r5\n\
  14517.    ldrb r1, [r1, 0x2]\n\
  14518.    bl __divsi3\n\
  14519.    mov r1, r8\n\
  14520.    str r0, [r1]\n\
  14521.    movs r1, 0x32\n\
  14522.    bl __divsi3\n\
  14523.    adds r2, r0, 0x2\n\
  14524.    mov r0, r8\n\
  14525.    str r2, [r0]\n\
  14526.    ldr r1, _08029C08 @ =gProtectStructs\n\
  14527.    ldrb r0, [r6]\n\
  14528.    lsls r0, 4\n\
  14529.    adds r0, r1\n\
  14530.    ldrb r0, [r0]\n\
  14531.    lsls r0, 28\n\
  14532.    cmp r0, 0\n\
  14533.    bge _08029BD4\n\
  14534.    lsls r0, r2, 4\n\
  14535.    subs r0, r2\n\
  14536.    movs r1, 0xA\n\
  14537.    bl __divsi3\n\
  14538.    mov r1, r8\n\
  14539.    str r0, [r1]\n\
  14540. _08029BD4:\n\
  14541.    mov r2, r9\n\
  14542.    ldrb r0, [r2]\n\
  14543.    adds r0, 0x1\n\
  14544.    strb r0, [r2]\n\
  14545.    b _08029C46\n\
  14546.    .align 2, 0\n\
  14547. _08029BE0: .4byte gBattleCommunication\n\
  14548. _08029BE4: .4byte gBattleTextBuff1\n\
  14549. _08029BE8: .4byte gBankAttacker\n\
  14550. _08029BEC: .4byte gBattlescriptCurrInstr\n\
  14551. _08029BF0: .4byte gBattleMoveDamage\n\
  14552. _08029BF4: .4byte gBaseStats\n\
  14553. _08029BF8: .4byte gBattleMoves\n\
  14554. _08029BFC: .4byte gCurrentMove\n\
  14555. _08029C00: .4byte gBattleMons\n\
  14556. _08029C04: .4byte gBankTarget\n\
  14557. _08029C08: .4byte gProtectStructs\n\
  14558. _08029C0C:\n\
  14559.    mov r0, r8\n\
  14560.    cmp r0, 0\n\
  14561.    beq _08029C2C\n\
  14562.    ldr r3, _08029C28 @ =gBattlescriptCurrInstr\n\
  14563.    ldr r2, [r3]\n\
  14564.    ldrb r1, [r2, 0x1]\n\
  14565.    ldrb r0, [r2, 0x2]\n\
  14566.    lsls r0, 8\n\
  14567.    orrs r1, r0\n\
  14568.    ldrb r0, [r2, 0x3]\n\
  14569.    lsls r0, 16\n\
  14570.    orrs r1, r0\n\
  14571.    ldrb r0, [r2, 0x4]\n\
  14572.    b _08029C40\n\
  14573.    .align 2, 0\n\
  14574. _08029C28: .4byte gBattlescriptCurrInstr\n\
  14575. _08029C2C:\n\
  14576.    ldr r3, _08029C54 @ =gBattlescriptCurrInstr\n\
  14577.    ldr r2, [r3]\n\
  14578.    ldrb r1, [r2, 0x5]\n\
  14579.    ldrb r0, [r2, 0x6]\n\
  14580.    lsls r0, 8\n\
  14581.    orrs r1, r0\n\
  14582.    ldrb r0, [r2, 0x7]\n\
  14583.    lsls r0, 16\n\
  14584.    orrs r1, r0\n\
  14585.    ldrb r0, [r2, 0x8]\n\
  14586. _08029C40:\n\
  14587.    lsls r0, 24\n\
  14588.    orrs r1, r0\n\
  14589.    str r1, [r3]\n\
  14590. _08029C46:\n\
  14591.    pop {r3,r4}\n\
  14592.    mov r8, r3\n\
  14593.    mov r9, r4\n\
  14594.    pop {r4-r7}\n\
  14595.    pop {r0}\n\
  14596.    bx r0\n\
  14597.    .align 2, 0\n\
  14598. _08029C54: .4byte gBattlescriptCurrInstr\n\
  14599.        .syntax divided");
  14600. }
  14601. #endif // NONMATCHING
  14602.  
  14603. static void atkC5_setsemiinvulnerablebit(void)
  14604. {
  14605.     switch (gCurrentMove)
  14606.     {
  14607.     case MOVE_FLY:
  14608.     case MOVE_BOUNCE:
  14609.         gStatuses3[gBankAttacker] |= STATUS3_ON_AIR;
  14610.         break;
  14611.     case MOVE_DIG:
  14612.         gStatuses3[gBankAttacker] |= STATUS3_UNDERGROUND;
  14613.         break;
  14614.     case MOVE_DIVE:
  14615.         gStatuses3[gBankAttacker] |= STATUS3_UNDERWATER;
  14616.         break;
  14617.     }
  14618.     gBattlescriptCurrInstr++;
  14619. }
  14620.  
  14621. static void atkC6_clearsemiinvulnerablebit(void)
  14622. {
  14623.     switch (gCurrentMove)
  14624.     {
  14625.     case MOVE_FLY:
  14626.     case MOVE_BOUNCE:
  14627.         gStatuses3[gBankAttacker] &= ~STATUS3_ON_AIR;
  14628.         break;
  14629.     case MOVE_DIG:
  14630.         gStatuses3[gBankAttacker] &= ~STATUS3_UNDERGROUND;
  14631.         break;
  14632.     case MOVE_DIVE:
  14633.         gStatuses3[gBankAttacker] &= ~STATUS3_UNDERWATER;
  14634.         break;
  14635.     }
  14636.     gBattlescriptCurrInstr++;
  14637. }
  14638.  
  14639. static void atkC7_setminimize(void)
  14640. {
  14641.     if (gHitMarker & HITMARKER_OBEYS)
  14642.         gStatuses3[gBankAttacker] |= STATUS3_MINIMIZED;
  14643.     gBattlescriptCurrInstr++;
  14644. }
  14645.  
  14646. static void atkC8_sethail(void)
  14647. {
  14648.     if (gBattleWeather & WEATHER_HAIL)
  14649.     {
  14650.         gMoveResultFlags |= MOVE_RESULT_MISSED;
  14651.         gBattleCommunication[MULTISTRING_CHOOSER] = 2;
  14652.     }
  14653.     else
  14654.     {
  14655.         gBattleWeather = WEATHER_HAIL;
  14656.         gBattleCommunication[MULTISTRING_CHOOSER] = 5;
  14657.         gWishFutureKnock.weatherDuration = 5;
  14658.     }
  14659.     gBattlescriptCurrInstr++;
  14660. }
  14661.  
  14662. static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento
  14663. {
  14664.     if (gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] == 0
  14665.         && gBattleMons[gBankTarget].statStages[STAT_STAGE_SPATK] == 0
  14666.         && gBattleCommunication[6] != 1)
  14667.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14668.     else
  14669.     {
  14670.         gActiveBattler = gBankAttacker;
  14671.         gBattleMoveDamage = gBattleMons[gActiveBattler].hp;
  14672.         EmitHealthBarUpdate(0, 0x7FFF);
  14673.         MarkBufferBankForExecution(gActiveBattler);
  14674.         gBattlescriptCurrInstr += 5;
  14675.     }
  14676. }
  14677.  
  14678. static void atkCA_setforcedtarget(void) //follow me
  14679. {
  14680.     gSideTimers[GetBattlerSide(gBankAttacker)].followmeTimer = 1;
  14681.     gSideTimers[GetBattlerSide(gBankAttacker)].followmeTarget = gBankAttacker;
  14682.     gBattlescriptCurrInstr++;
  14683. }
  14684.  
  14685. static void atkCB_setcharge(void)
  14686. {
  14687.     gStatuses3[gBankAttacker] |= STATUS3_CHARGED_UP;
  14688.     gDisableStructs[gBankAttacker].chargeTimer1 = 2;
  14689.     gDisableStructs[gBankAttacker].chargeTimer2 = 2;
  14690.     gBattlescriptCurrInstr++;
  14691. }
  14692.  
  14693. static void atkCC_callterrainattack(void) //nature power
  14694. {
  14695.     gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  14696.     gCurrentMove = sNaturePowerMoves[gBattleTerrain];
  14697.     gBankTarget = GetMoveTarget(gCurrentMove, 0);
  14698.     BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);
  14699.     gBattlescriptCurrInstr++;
  14700. }
  14701.  
  14702. static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh
  14703. {
  14704.     if (gBattleMons[gBankAttacker].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS | STATUS_TOXIC_POISON))
  14705.     {
  14706.         gBattleMons[gBankAttacker].status1 = 0;
  14707.         gBattlescriptCurrInstr += 5;
  14708.         gActiveBattler = gBankAttacker;
  14709.         EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
  14710.         MarkBufferBankForExecution(gActiveBattler);
  14711.     }
  14712.     else
  14713.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14714. }
  14715.  
  14716. static void atkCE_settorment(void)
  14717. {
  14718.     if (gBattleMons[gBankTarget].status2 & STATUS2_TORMENT)
  14719.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14720.     else
  14721.     {
  14722.         gBattleMons[gBankTarget].status2 |= STATUS2_TORMENT;
  14723.         gBattlescriptCurrInstr += 5;
  14724.     }
  14725. }
  14726.  
  14727. static void atkCF_jumpifnodamage(void)
  14728. {
  14729.     if (gProtectStructs[gBankAttacker].physicalDmg || gProtectStructs[gBankAttacker].specialDmg)
  14730.         gBattlescriptCurrInstr += 5;
  14731.     else
  14732.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14733. }
  14734.  
  14735. static void atkD0_settaunt(void)
  14736. {
  14737.     if (gDisableStructs[gBankTarget].tauntTimer1 == 0)
  14738.     {
  14739.         gDisableStructs[gBankTarget].tauntTimer1 = 2;
  14740.         gDisableStructs[gBankTarget].tauntTimer2 = 2;
  14741.         gBattlescriptCurrInstr += 5;
  14742.     }
  14743.     else
  14744.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14745. }
  14746.  
  14747. static void atkD1_trysethelpinghand(void)
  14748. {
  14749.     gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2);
  14750.     if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gBankTarget])
  14751.         && !gProtectStructs[gBankAttacker].helpingHand && !gProtectStructs[gBankTarget].helpingHand)
  14752.     {
  14753.         gProtectStructs[gBankTarget].helpingHand = 1;
  14754.         gBattlescriptCurrInstr += 5;
  14755.     }
  14756.     else
  14757.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14758. }
  14759.  
  14760. #ifdef NONMATCHING
  14761. static void atkD2_tryswapitems(void)
  14762. {
  14763.     if ((GetBattlerSide(gBankAttacker) != 1 || gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER) || gTrainerBattleOpponent == 0x400))
  14764.     {
  14765.         u8 side = GetBattlerSide(gBankAttacker);
  14766.         if (gBattleTypeFlags)
  14767.     }
  14768.  
  14769.     gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  14770. }
  14771.  
  14772. #else
  14773. NAKED
  14774. static void atkD2_tryswapitems(void)
  14775. {
  14776.     asm(".syntax unified\n\
  14777.    push {r4-r7,lr}\n\
  14778.    mov r7, r10\n\
  14779.    mov r6, r9\n\
  14780.    mov r5, r8\n\
  14781.    push {r5-r7}\n\
  14782.    sub sp, 0x4\n\
  14783.    ldr r0, _0802A30C @ =gBankAttacker\n\
  14784.    ldrb r0, [r0]\n\
  14785.    bl GetBattlerSide\n\
  14786.    lsls r0, 24\n\
  14787.    lsrs r0, 24\n\
  14788.    cmp r0, 0x1\n\
  14789.    bne _0802A24C\n\
  14790.    ldr r0, _0802A310 @ =gBattleTypeFlags\n\
  14791.    ldrh r1, [r0]\n\
  14792.    ldr r0, _0802A314 @ =0x00000902\n\
  14793.    ands r0, r1\n\
  14794.    cmp r0, 0\n\
  14795.    bne _0802A24C\n\
  14796.    ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\
  14797.    ldrh r1, [r0]\n\
  14798.    movs r0, 0x80\n\
  14799.    lsls r0, 3\n\
  14800.    cmp r1, r0\n\
  14801.    bne _0802A2EE\n\
  14802. _0802A24C:\n\
  14803.    ldr r4, _0802A30C @ =gBankAttacker\n\
  14804.    ldrb r0, [r4]\n\
  14805.    bl GetBattlerSide\n\
  14806.    lsls r0, 24\n\
  14807.    lsrs r2, r0, 24\n\
  14808.    ldr r0, _0802A310 @ =gBattleTypeFlags\n\
  14809.    ldrh r1, [r0]\n\
  14810.    ldr r0, _0802A314 @ =0x00000902\n\
  14811.    ands r0, r1\n\
  14812.    cmp r0, 0\n\
  14813.    bne _0802A290\n\
  14814.    ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\
  14815.    ldrh r1, [r0]\n\
  14816.    movs r0, 0x80\n\
  14817.    lsls r0, 3\n\
  14818.    cmp r1, r0\n\
  14819.    beq _0802A290\n\
  14820.    ldr r0, _0802A31C @ =gWishFutureKnock\n\
  14821.    adds r0, 0x29\n\
  14822.    adds r0, r2, r0\n\
  14823.    ldrb r1, [r0]\n\
  14824.    ldr r3, _0802A320 @ =gBitTable\n\
  14825.    ldr r2, _0802A324 @ =gBattlerPartyIndexes\n\
  14826.    ldrb r0, [r4]\n\
  14827.    lsls r0, 1\n\
  14828.    adds r0, r2\n\
  14829.    ldrh r0, [r0]\n\
  14830.    lsls r0, 2\n\
  14831.    adds r0, r3\n\
  14832.    ldr r0, [r0]\n\
  14833.    ands r1, r0\n\
  14834.    cmp r1, 0\n\
  14835.    bne _0802A2EE\n\
  14836. _0802A290:\n\
  14837.    ldr r0, _0802A328 @ =gBattleMons\n\
  14838.    mov r9, r0\n\
  14839.    ldr r1, _0802A30C @ =gBankAttacker\n\
  14840.    ldrb r4, [r1]\n\
  14841.    movs r2, 0x58\n\
  14842.    mov r8, r2\n\
  14843.    mov r0, r8\n\
  14844.    muls r0, r4\n\
  14845.    mov r3, r9\n\
  14846.    adds r5, r0, r3\n\
  14847.    ldrh r3, [r5, 0x2E]\n\
  14848.    adds r1, r3, 0\n\
  14849.    cmp r1, 0\n\
  14850.    bne _0802A2BE\n\
  14851.    ldr r0, _0802A32C @ =gBankTarget\n\
  14852.    ldrb r0, [r0]\n\
  14853.    mov r2, r8\n\
  14854.    muls r2, r0\n\
  14855.    adds r0, r2, 0\n\
  14856.    add r0, r9\n\
  14857.    ldrh r0, [r0, 0x2E]\n\
  14858.    cmp r0, 0\n\
  14859.    beq _0802A2EE\n\
  14860. _0802A2BE:\n\
  14861.    cmp r1, 0xAF\n\
  14862.    beq _0802A2EE\n\
  14863.    ldr r7, _0802A32C @ =gBankTarget\n\
  14864.    ldrb r0, [r7]\n\
  14865.    mov r1, r8\n\
  14866.    muls r1, r0\n\
  14867.    adds r0, r1, 0\n\
  14868.    mov r1, r9\n\
  14869.    adds r2, r0, r1\n\
  14870.    ldrh r1, [r2, 0x2E]\n\
  14871.    cmp r1, 0xAF\n\
  14872.    beq _0802A2EE\n\
  14873.    adds r0, r3, 0\n\
  14874.    subs r0, 0x79\n\
  14875.    lsls r0, 16\n\
  14876.    lsrs r0, 16\n\
  14877.    cmp r0, 0xB\n\
  14878.    bls _0802A2EE\n\
  14879.    adds r0, r1, 0\n\
  14880.    subs r0, 0x79\n\
  14881.    lsls r0, 16\n\
  14882.    lsrs r0, 16\n\
  14883.    cmp r0, 0xB\n\
  14884.    bhi _0802A334\n\
  14885. _0802A2EE:\n\
  14886.    ldr r3, _0802A330 @ =gBattlescriptCurrInstr\n\
  14887.    ldr r2, [r3]\n\
  14888.    ldrb r1, [r2, 0x1]\n\
  14889.    ldrb r0, [r2, 0x2]\n\
  14890.    lsls r0, 8\n\
  14891.    orrs r1, r0\n\
  14892.    ldrb r0, [r2, 0x3]\n\
  14893.    lsls r0, 16\n\
  14894.    orrs r1, r0\n\
  14895.    ldrb r0, [r2, 0x4]\n\
  14896.    lsls r0, 24\n\
  14897.    orrs r1, r0\n\
  14898.    str r1, [r3]\n\
  14899.    b _0802A49A\n\
  14900.    .align 2, 0\n\
  14901. _0802A30C: .4byte gBankAttacker\n\
  14902. _0802A310: .4byte gBattleTypeFlags\n\
  14903. _0802A314: .4byte 0x00000902\n\
  14904. _0802A318: .4byte gTrainerBattleOpponent\n\
  14905. _0802A31C: .4byte gWishFutureKnock\n\
  14906. _0802A320: .4byte gBitTable\n\
  14907. _0802A324: .4byte gBattlerPartyIndexes\n\
  14908. _0802A328: .4byte gBattleMons\n\
  14909. _0802A32C: .4byte gBankTarget\n\
  14910. _0802A330: .4byte gBattlescriptCurrInstr\n\
  14911. _0802A334:\n\
  14912.    adds r0, r2, 0\n\
  14913.    adds r0, 0x20\n\
  14914.    ldrb r0, [r0]\n\
  14915.    cmp r0, 0x3C\n\
  14916.    bne _0802A36C\n\
  14917.    ldr r1, _0802A360 @ =gBattlescriptCurrInstr\n\
  14918.    ldr r0, _0802A364 @ =BattleScript_NoItemSteal\n\
  14919.    str r0, [r1]\n\
  14920.    ldr r1, _0802A368 @ =gLastUsedAbility\n\
  14921.    ldrb r0, [r7]\n\
  14922.    mov r2, r8\n\
  14923.    muls r2, r0\n\
  14924.    adds r0, r2, 0\n\
  14925.    add r0, r9\n\
  14926.    adds r0, 0x20\n\
  14927.    ldrb r0, [r0]\n\
  14928.    strb r0, [r1]\n\
  14929.    ldrb r0, [r7]\n\
  14930.    ldrb r1, [r1]\n\
  14931.    bl RecordAbilityBattle\n\
  14932.    b _0802A49A\n\
  14933.    .align 2, 0\n\
  14934. _0802A360: .4byte gBattlescriptCurrInstr\n\
  14935. _0802A364: .4byte BattleScript_NoItemSteal\n\
  14936. _0802A368: .4byte gLastUsedAbility\n\
  14937. _0802A36C:\n\
  14938.    lsls r0, r4, 1\n\
  14939.    ldr r4, _0802A458 @ =gSharedMem + 0x160F0\n\
  14940.    adds r6, r0, r4\n\
  14941.    ldrh r5, [r5, 0x2E]\n\
  14942.    mov r10, r5\n\
  14943.    strh r1, [r6]\n\
  14944.    ldr r3, _0802A45C @ =gBankAttacker\n\
  14945.    ldrb r0, [r3]\n\
  14946.    mov r1, r8\n\
  14947.    muls r1, r0\n\
  14948.    adds r0, r1, 0\n\
  14949.    add r0, r9\n\
  14950.    movs r1, 0\n\
  14951.    strh r1, [r0, 0x2E]\n\
  14952.    ldrb r0, [r7]\n\
  14953.    mov r2, r8\n\
  14954.    muls r2, r0\n\
  14955.    adds r0, r2, 0\n\
  14956.    add r0, r9\n\
  14957.    mov r3, r10\n\
  14958.    strh r3, [r0, 0x2E]\n\
  14959.    ldr r5, _0802A460 @ =gActiveBattler\n\
  14960.    ldr r1, _0802A45C @ =gBankAttacker\n\
  14961.    ldrb r0, [r1]\n\
  14962.    strb r0, [r5]\n\
  14963.    str r6, [sp]\n\
  14964.    movs r0, 0\n\
  14965.    movs r1, 0x2\n\
  14966.    movs r2, 0\n\
  14967.    movs r3, 0x2\n\
  14968.    bl EmitSetMonData\n\
  14969.    ldr r2, _0802A45C @ =gBankAttacker\n\
  14970.    ldrb r0, [r2]\n\
  14971.    bl MarkBufferBankForExecution\n\
  14972.    ldrb r0, [r7]\n\
  14973.    strb r0, [r5]\n\
  14974.    ldrb r0, [r7]\n\
  14975.    mov r3, r8\n\
  14976.    muls r3, r0\n\
  14977.    adds r0, r3, 0\n\
  14978.    mov r1, r9\n\
  14979.    adds r1, 0x2E\n\
  14980.    adds r0, r1\n\
  14981.    str r0, [sp]\n\
  14982.    movs r0, 0\n\
  14983.    movs r1, 0x2\n\
  14984.    movs r2, 0\n\
  14985.    movs r3, 0x2\n\
  14986.    bl EmitSetMonData\n\
  14987.    ldrb r0, [r7]\n\
  14988.    bl MarkBufferBankForExecution\n\
  14989.    ldr r0, _0802A464 @ =0xfffe9f10\n\
  14990.    adds r4, r0\n\
  14991.    ldrb r0, [r7]\n\
  14992.    lsls r0, 1\n\
  14993.    ldr r2, _0802A468 @ =0x000160e8\n\
  14994.    adds r0, r2\n\
  14995.    adds r0, r4\n\
  14996.    movs r1, 0\n\
  14997.    strb r1, [r0]\n\
  14998.    ldrb r0, [r7]\n\
  14999.    lsls r0, 1\n\
  15000.    ldr r1, _0802A46C @ =0x000160e9\n\
  15001.    adds r0, r1\n\
  15002.    adds r0, r4\n\
  15003.    movs r3, 0\n\
  15004.    strb r3, [r0]\n\
  15005.    ldr r3, _0802A45C @ =gBankAttacker\n\
  15006.    ldrb r0, [r3]\n\
  15007.    lsls r0, 1\n\
  15008.    adds r0, r2\n\
  15009.    adds r0, r4\n\
  15010.    movs r2, 0\n\
  15011.    strb r2, [r0]\n\
  15012.    ldrb r0, [r3]\n\
  15013.    lsls r0, 1\n\
  15014.    adds r0, r1\n\
  15015.    adds r0, r4\n\
  15016.    strb r2, [r0]\n\
  15017.    ldr r1, _0802A470 @ =gBattlescriptCurrInstr\n\
  15018.    ldr r0, [r1]\n\
  15019.    adds r0, 0x5\n\
  15020.    str r0, [r1]\n\
  15021.    ldr r1, _0802A474 @ =gBattleTextBuff1\n\
  15022.    movs r3, 0xFD\n\
  15023.    strb r3, [r1]\n\
  15024.    movs r2, 0xA\n\
  15025.    strb r2, [r1, 0x1]\n\
  15026.    ldrh r0, [r6]\n\
  15027.    strb r0, [r1, 0x2]\n\
  15028.    ldrh r0, [r6]\n\
  15029.    lsrs r0, 8\n\
  15030.    strb r0, [r1, 0x3]\n\
  15031.    movs r0, 0xFF\n\
  15032.    strb r0, [r1, 0x4]\n\
  15033.    ldr r1, _0802A478 @ =gBattleTextBuff2\n\
  15034.    strb r3, [r1]\n\
  15035.    strb r2, [r1, 0x1]\n\
  15036.    mov r3, r10\n\
  15037.    strb r3, [r1, 0x2]\n\
  15038.    mov r2, r10\n\
  15039.    lsrs r0, r2, 8\n\
  15040.    strb r0, [r1, 0x3]\n\
  15041.    movs r0, 0x1\n\
  15042.    negs r0, r0\n\
  15043.    strb r0, [r1, 0x4]\n\
  15044.    cmp r2, 0\n\
  15045.    beq _0802A480\n\
  15046.    ldrh r0, [r6]\n\
  15047.    cmp r0, 0\n\
  15048.    beq _0802A494\n\
  15049.    ldr r1, _0802A47C @ =gBattleCommunication\n\
  15050.    movs r0, 0x2\n\
  15051.    b _0802A498\n\
  15052.    .align 2, 0\n\
  15053. _0802A458: .4byte gSharedMem + 0x160F0\n\
  15054. _0802A45C: .4byte gBankAttacker\n\
  15055. _0802A460: .4byte gActiveBattler\n\
  15056. _0802A464: .4byte 0xfffe9f10\n\
  15057. _0802A468: .4byte 0x000160e8\n\
  15058. _0802A46C: .4byte 0x000160e9\n\
  15059. _0802A470: .4byte gBattlescriptCurrInstr\n\
  15060. _0802A474: .4byte gBattleTextBuff1\n\
  15061. _0802A478: .4byte gBattleTextBuff2\n\
  15062. _0802A47C: .4byte gBattleCommunication\n\
  15063. _0802A480:\n\
  15064.    ldrh r0, [r6]\n\
  15065.    cmp r0, 0\n\
  15066.    beq _0802A494\n\
  15067.    ldr r0, _0802A490 @ =gBattleCommunication\n\
  15068.    movs r3, 0\n\
  15069.    strb r3, [r0, 0x5]\n\
  15070.    b _0802A49A\n\
  15071.    .align 2, 0\n\
  15072. _0802A490: .4byte gBattleCommunication\n\
  15073. _0802A494:\n\
  15074.    ldr r1, _0802A4AC @ =gBattleCommunication\n\
  15075.    movs r0, 0x1\n\
  15076. _0802A498:\n\
  15077.    strb r0, [r1, 0x5]\n\
  15078. _0802A49A:\n\
  15079.    add sp, 0x4\n\
  15080.    pop {r3-r5}\n\
  15081.    mov r8, r3\n\
  15082.    mov r9, r4\n\
  15083.    mov r10, r5\n\
  15084.    pop {r4-r7}\n\
  15085.    pop {r0}\n\
  15086.    bx r0\n\
  15087.    .align 2, 0\n\
  15088. _0802A4AC: .4byte gBattleCommunication\n\
  15089.        .syntax divided");
  15090. }
  15091. #endif // NONMATCHING
  15092.  
  15093. static void atkD3_trycopyability(void) //role play
  15094. {
  15095.     if (gBattleMons[gBankTarget].ability != 0 && gBattleMons[gBankTarget].ability != ABILITY_WONDER_GUARD)
  15096.     {
  15097.         gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability;
  15098.         gLastUsedAbility = gBattleMons[gBankTarget].ability;
  15099.         gBattlescriptCurrInstr += 5;
  15100.     }
  15101.     else
  15102.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15103. }
  15104.  
  15105. static void atkD4_trywish(void)
  15106. {
  15107.     switch (T2_READ_8(gBattlescriptCurrInstr + 1))
  15108.     {
  15109.     case 0: //use wish
  15110.         if (gWishFutureKnock.wishCounter[gBankAttacker] == 0)
  15111.         {
  15112.             gWishFutureKnock.wishCounter[gBankAttacker] = 2;
  15113.             gWishFutureKnock.wishUserID[gBankAttacker] = gBattlerPartyIndexes[gBankAttacker];
  15114.             gBattlescriptCurrInstr += 6;
  15115.         }
  15116.         else
  15117.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  15118.         break;
  15119.     case 1: //heal effect
  15120.         gBattleTextBuff1[0] = 0xFD;
  15121.         gBattleTextBuff1[1] = 4;
  15122.         gBattleTextBuff1[2] = gBankTarget;
  15123.         gBattleTextBuff1[3] = gWishFutureKnock.wishUserID[gBankTarget];
  15124.         gBattleTextBuff1[4] = 0xFF;
  15125.         gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2;
  15126.         if (gBattleMoveDamage == 0)
  15127.             gBattleMoveDamage = 1;
  15128.         gBattleMoveDamage *= -1;
  15129.         if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP)
  15130.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  15131.         else
  15132.             gBattlescriptCurrInstr += 6;
  15133.         break;
  15134.     }
  15135. }
  15136.  
  15137. static void atkD5_trysetroots(void) //ingrain
  15138. {
  15139.     if (gStatuses3[gBankAttacker] & STATUS3_ROOTED)
  15140.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15141.     else
  15142.     {
  15143.         gStatuses3[gBankAttacker] |= STATUS3_ROOTED;
  15144.         gBattlescriptCurrInstr += 5;
  15145.     }
  15146. }
  15147.  
  15148. static void atkD6_doubledamagedealtifdamaged(void)
  15149. {
  15150.     if ((gProtectStructs[gBankAttacker].physicalDmg && gProtectStructs[gBankAttacker].physicalBank == gBankTarget)
  15151.         || (gProtectStructs[gBankAttacker].specialDmg && gProtectStructs[gBankAttacker].specialBank == gBankTarget))
  15152.             gBattleStruct->dmgMultiplier = 2;
  15153.     gBattlescriptCurrInstr++;
  15154. }
  15155.  
  15156. static void atkD7_setyawn(void)
  15157. {
  15158.     if (gStatuses3[gBankTarget] & STATUS3_YAWN || (u8) gBattleMons[gBankTarget].status1)
  15159.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15160.     else
  15161.     {
  15162.         gStatuses3[gBankTarget] |= 0x1000;
  15163.         gBattlescriptCurrInstr += 5;
  15164.     }
  15165. }
  15166.  
  15167. static void atkD8_setdamagetohealthdifference(void)
  15168. {
  15169.     if (gBattleMons[gBankTarget].hp <= gBattleMons[gBankAttacker].hp)
  15170.     {
  15171.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15172.     }
  15173.     else
  15174.     {
  15175.         gBattleMoveDamage = gBattleMons[gBankTarget].hp - gBattleMons[gBankAttacker].hp;
  15176.         gBattlescriptCurrInstr += 5;
  15177.     }
  15178. }
  15179.  
  15180. static void atkD9_scaledamagebyhealthratio(void)
  15181. {
  15182.     if (gDynamicBasePower == 0)
  15183.     {
  15184.         u8 power = gBattleMoves[gCurrentMove].power;
  15185.         gDynamicBasePower = gBattleMons[gBankAttacker].hp * power / gBattleMons[gBankAttacker].maxHP;
  15186.         if (gDynamicBasePower == 0)
  15187.             gDynamicBasePower = 1;
  15188.     }
  15189.     gBattlescriptCurrInstr++;
  15190. }
  15191.  
  15192. static void atkDA_tryswapabilities(void)
  15193. {
  15194.     if ((gBattleMons[gBankAttacker].ability == 0 && gBattleMons[gBankTarget].ability == 0)
  15195.      || gBattleMons[gBankAttacker].ability == ABILITY_WONDER_GUARD || gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD
  15196.      || gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
  15197.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15198.     else
  15199.     {
  15200.         u8 atk_ability = gBattleMons[gBankAttacker].ability;
  15201.         gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability;
  15202.         gBattleMons[gBankTarget].ability = atk_ability;
  15203.         gBattlescriptCurrInstr += 5;
  15204.     }
  15205. }
  15206.  
  15207. static void atkDB_tryimprision(void)
  15208. {
  15209.     u8 r8 = 0;
  15210.     if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISIONED))
  15211.     {
  15212.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15213.     }
  15214.     else
  15215.     {
  15216.         u8 bank;
  15217.         PressurePPLoseOnUsingImprision(gBankAttacker);
  15218.         for (bank = 0; bank < gBattlersCount; bank++)
  15219.         {
  15220.             if (r8 != GetBattlerSide(bank))
  15221.             {
  15222.                 int j;
  15223.                 for (j = 0; j < 4; j++)
  15224.                 {
  15225.                     int k;
  15226.                     for (k = 0; k < 4; k++)
  15227.                     {
  15228.                         if (gBattleMons[gBankAttacker].moves[j] == gBattleMons[bank].moves[k] && gBattleMons[gBankAttacker].moves[j])
  15229.                             break;
  15230.                     }
  15231.                     if (k != 4)
  15232.                         break;
  15233.                 }
  15234.                 if (j != 4)
  15235.                 {
  15236.                     gStatuses3[gBankAttacker] |= STATUS3_IMPRISIONED;
  15237.                     gBattlescriptCurrInstr += 5;
  15238.                     break;
  15239.                 }
  15240.             }
  15241.         }
  15242.         if (bank == gBattlersCount)
  15243.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15244.     }
  15245. }
  15246.  
  15247. static void atkDC_trysetgrudge(void)
  15248. {
  15249.     if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE)
  15250.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15251.     else
  15252.     {
  15253.         gStatuses3[gBankAttacker] |= STATUS3_GRUDGE;
  15254.         gBattlescriptCurrInstr += 5;
  15255.     }
  15256. }
  15257.  
  15258. static void atkDD_weightdamagecalculation(void)
  15259. {
  15260.     int i;
  15261.     for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2)
  15262.     {
  15263.         if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1))
  15264.             break;
  15265.     }
  15266.     if (sWeightToDamageTable[i] != 0xFFFF)
  15267.         gDynamicBasePower = sWeightToDamageTable[i + 1];
  15268.     else
  15269.         gDynamicBasePower = 120;
  15270.     gBattlescriptCurrInstr++;
  15271. }
  15272.  
  15273. #ifdef NONMATCHING
  15274. static void atkDE_asistattackselect(void)
  15275. {
  15276.     u32 chooseable_moves_no = 0;
  15277.     struct Pokemon* party;
  15278.     int i, j;
  15279.     u16* chooseable_moves;
  15280.     if (GetBattlerPosition(gBankAttacker) & 1)
  15281.         party = gEnemyParty;
  15282.     else
  15283.         party = gPlayerParty;
  15284.  
  15285.     for (i = 0; i < 6; i++)
  15286.     {
  15287.         if (i == gBattlerPartyIndexes[gBankAttacker])
  15288.             break;
  15289.         if (!GetMonData(&party[i], MON_DATA_SPECIES2) || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
  15290.             break;
  15291.         chooseable_moves = &gBattleStruct->assistMove[chooseable_moves_no];
  15292.         for (j = 0; j < 4; j++)
  15293.         {
  15294.             int k;
  15295.             u16 move = GetMonData(&party[i], MON_DATA_MOVE1 + i);
  15296.             if (IsMoveUnchoosable(move))
  15297.                 break;
  15298.             //sMovesForbiddenToCopy[k]
  15299.             for (k = 0; ;k++)
  15300.             {
  15301.                 if (sMovesForbiddenToCopy[k] == 0xFFFF)
  15302.                 {
  15303.                     if (move)
  15304.                     {
  15305.                         *chooseable_moves = move;
  15306.                         chooseable_moves++;
  15307.                         chooseable_moves_no++;
  15308.                     }
  15309.                     break;
  15310.                 }
  15311.                 if (sMovesForbiddenToCopy[k] == move)
  15312.                     break;
  15313.             }
  15314.         }
  15315.     }
  15316.     if (chooseable_moves_no)
  15317.     {
  15318.         gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
  15319.         gRandomMove = gBattleStruct->assistMove[Random() % chooseable_moves_no];
  15320.         gBankTarget = GetMoveTarget(gRandomMove, 0);
  15321.         gBattlescriptCurrInstr += 5;
  15322.     }
  15323.     else
  15324.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15325. }
  15326.  
  15327. #else
  15328. NAKED
  15329. static void atkDE_asistattackselect(void)
  15330. {
  15331.     asm(".syntax unified\n\
  15332.    push {r4-r7,lr}\n\
  15333.    mov r7, r10\n\
  15334.    mov r6, r9\n\
  15335.    mov r5, r8\n\
  15336.    push {r5-r7}\n\
  15337.    sub sp, 0x8\n\
  15338.    movs r0, 0\n\
  15339.    mov r10, r0\n\
  15340.    ldr r0, _0802AB9C @ =gBankAttacker\n\
  15341.    ldrb r0, [r0]\n\
  15342.    bl GetBattlerPosition\n\
  15343.    movs r1, 0x1\n\
  15344.    ands r1, r0\n\
  15345.    ldr r0, _0802ABA0 @ =gPlayerParty\n\
  15346.    str r0, [sp]\n\
  15347.    cmp r1, 0\n\
  15348.    beq _0802AAAC\n\
  15349.    ldr r1, _0802ABA4 @ =gEnemyParty\n\
  15350.    str r1, [sp]\n\
  15351. _0802AAAC:\n\
  15352.    movs r2, 0\n\
  15353. _0802AAAE:\n\
  15354.    ldr r1, _0802ABA8 @ =gBattlerPartyIndexes\n\
  15355.    ldr r0, _0802AB9C @ =gBankAttacker\n\
  15356.    ldrb r0, [r0]\n\
  15357.    lsls r0, 1\n\
  15358.    adds r0, r1\n\
  15359.    adds r1, r2, 0x1\n\
  15360.    str r1, [sp, 0x4]\n\
  15361.    ldrh r0, [r0]\n\
  15362.    cmp r2, r0\n\
  15363.    beq _0802AB54\n\
  15364.    movs r0, 0x64\n\
  15365.    adds r6, r2, 0\n\
  15366.    muls r6, r0\n\
  15367.    ldr r0, [sp]\n\
  15368.    adds r4, r0, r6\n\
  15369.    adds r0, r4, 0\n\
  15370.    movs r1, 0x41\n\
  15371.    bl GetMonData\n\
  15372.    cmp r0, 0\n\
  15373.    beq _0802AB54\n\
  15374.    adds r0, r4, 0\n\
  15375.    movs r1, 0x41\n\
  15376.    bl GetMonData\n\
  15377.    movs r1, 0xCE\n\
  15378.    lsls r1, 1\n\
  15379.    cmp r0, r1\n\
  15380.    beq _0802AB54\n\
  15381.    movs r5, 0\n\
  15382.    ldr r1, _0802ABAC @ =0x0000ffff\n\
  15383.    mov r8, r1\n\
  15384.    mov r9, r6\n\
  15385.    mov r1, r10\n\
  15386.    lsls r0, r1, 1\n\
  15387.    ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\
  15388.    adds r6, r0, r1\n\
  15389. _0802AAF8:\n\
  15390.    movs r7, 0\n\
  15391.    adds r1, r5, 0\n\
  15392.    adds r1, 0xD\n\
  15393.    ldr r0, [sp]\n\
  15394.    add r0, r9\n\
  15395.    bl GetMonData\n\
  15396.    lsls r0, 16\n\
  15397.    lsrs r4, r0, 16\n\
  15398.    adds r0, r4, 0\n\
  15399.    bl IsMoveUnchoosable\n\
  15400.    lsls r0, 24\n\
  15401.    adds r1, r5, 0x1\n\
  15402.    cmp r0, 0\n\
  15403.    bne _0802AB4E\n\
  15404.    ldr r0, _0802ABB4 @ =sMovesForbiddenToCopy\n\
  15405.    ldrh r2, [r0]\n\
  15406.    adds r3, r0, 0\n\
  15407.    cmp r2, r8\n\
  15408.    beq _0802AB42\n\
  15409.    cmp r4, r2\n\
  15410.    beq _0802AB38\n\
  15411.    ldr r5, _0802ABAC @ =0x0000ffff\n\
  15412.    adds r2, r3, 0\n\
  15413. _0802AB2A:\n\
  15414.    adds r2, 0x2\n\
  15415.    adds r7, 0x1\n\
  15416.    ldrh r0, [r2]\n\
  15417.    cmp r0, r5\n\
  15418.    beq _0802AB42\n\
  15419.    cmp r4, r0\n\
  15420.    bne _0802AB2A\n\
  15421. _0802AB38:\n\
  15422.    lsls r0, r7, 1\n\
  15423.    adds r0, r3\n\
  15424.    ldrh r0, [r0]\n\
  15425.    cmp r0, r8\n\
  15426.    bne _0802AB4E\n\
  15427. _0802AB42:\n\
  15428.    cmp r4, 0\n\
  15429.    beq _0802AB4E\n\
  15430.    strh r4, [r6]\n\
  15431.    adds r6, 0x2\n\
  15432.    movs r0, 0x1\n\
  15433.    add r10, r0\n\
  15434. _0802AB4E:\n\
  15435.    adds r5, r1, 0\n\
  15436.    cmp r5, 0x3\n\
  15437.    ble _0802AAF8\n\
  15438. _0802AB54:\n\
  15439.    ldr r2, [sp, 0x4]\n\
  15440.    cmp r2, 0x5\n\
  15441.    ble _0802AAAE\n\
  15442.    mov r1, r10\n\
  15443.    cmp r1, 0\n\
  15444.    beq _0802ABCC\n\
  15445.    ldr r2, _0802ABB8 @ =gHitMarker\n\
  15446.    ldr r0, [r2]\n\
  15447.    ldr r1, _0802ABBC @ =0xfffffbff\n\
  15448.    ands r0, r1\n\
  15449.    str r0, [r2]\n\
  15450.    ldr r4, _0802ABC0 @ =gRandomMove\n\
  15451.    bl Random\n\
  15452.    movs r1, 0xFF\n\
  15453.    ands r1, r0\n\
  15454.    mov r0, r10\n\
  15455.    muls r0, r1\n\
  15456.    asrs r0, 8\n\
  15457.    lsls r0, 1\n\
  15458.    ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\
  15459.    adds r0, r1\n\
  15460.    ldrh r0, [r0]\n\
  15461.    strh r0, [r4]\n\
  15462.    ldrh r0, [r4]\n\
  15463.    movs r1, 0\n\
  15464.    bl GetMoveTarget\n\
  15465.    ldr r1, _0802ABC4 @ =gBankTarget\n\
  15466.    strb r0, [r1]\n\
  15467.    ldr r1, _0802ABC8 @ =gBattlescriptCurrInstr\n\
  15468.    ldr r0, [r1]\n\
  15469.    adds r0, 0x5\n\
  15470.    str r0, [r1]\n\
  15471.    b _0802ABE6\n\
  15472.    .align 2, 0\n\
  15473. _0802AB9C: .4byte gBankAttacker\n\
  15474. _0802ABA0: .4byte gPlayerParty\n\
  15475. _0802ABA4: .4byte gEnemyParty\n\
  15476. _0802ABA8: .4byte gBattlerPartyIndexes\n\
  15477. _0802ABAC: .4byte 0x0000ffff\n\
  15478. _0802ABB0: .4byte gSharedMem + 0x16024\n\
  15479. _0802ABB4: .4byte sMovesForbiddenToCopy\n\
  15480. _0802ABB8: .4byte gHitMarker\n\
  15481. _0802ABBC: .4byte 0xfffffbff\n\
  15482. _0802ABC0: .4byte gRandomMove\n\
  15483. _0802ABC4: .4byte gBankTarget\n\
  15484. _0802ABC8: .4byte gBattlescriptCurrInstr\n\
  15485. _0802ABCC:\n\
  15486.    ldr r3, _0802ABF8 @ =gBattlescriptCurrInstr\n\
  15487.    ldr r2, [r3]\n\
  15488.    ldrb r1, [r2, 0x1]\n\
  15489.    ldrb r0, [r2, 0x2]\n\
  15490.    lsls r0, 8\n\
  15491.    orrs r1, r0\n\
  15492.    ldrb r0, [r2, 0x3]\n\
  15493.    lsls r0, 16\n\
  15494.    orrs r1, r0\n\
  15495.    ldrb r0, [r2, 0x4]\n\
  15496.    lsls r0, 24\n\
  15497.    orrs r1, r0\n\
  15498.    str r1, [r3]\n\
  15499. _0802ABE6:\n\
  15500.    add sp, 0x8\n\
  15501.    pop {r3-r5}\n\
  15502.    mov r8, r3\n\
  15503.    mov r9, r4\n\
  15504.    mov r10, r5\n\
  15505.    pop {r4-r7}\n\
  15506.    pop {r0}\n\
  15507.    bx r0\n\
  15508.    .align 2, 0\n\
  15509. _0802ABF8: .4byte gBattlescriptCurrInstr\n\
  15510.        .syntax divided");
  15511. }
  15512.  
  15513. #endif // NONMATCHING
  15514.  
  15515. static void atkDF_trysetmagiccoat(void)
  15516. {
  15517.     gBankTarget = gBankAttacker;
  15518.     gSpecialStatuses[gBankAttacker].flag20 = 1;
  15519.     if (gCurrentTurnActionNumber == gBattlersCount - 1) //last turn
  15520.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15521.     else
  15522.     {
  15523.         gProtectStructs[gBankAttacker].bounceMove = 1;
  15524.         gBattlescriptCurrInstr += 5;
  15525.     }
  15526. }
  15527.  
  15528. static void atkE0_trysetsnatch(void)
  15529. {
  15530.     gSpecialStatuses[gBankAttacker].flag20 = 1;
  15531.     if (gCurrentTurnActionNumber == gBattlersCount - 1) //last turn
  15532.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15533.     else
  15534.     {
  15535.         gProtectStructs[gBankAttacker].stealMove = 1;
  15536.         gBattlescriptCurrInstr += 5;
  15537.     }
  15538. }
  15539.  
  15540. static void atkE1_trygetintimidatetarget(void)
  15541. {
  15542.     u8 side;
  15543.  
  15544.     gBattleStruct->scriptingActive = ewram160DD;
  15545.     side = GetBattlerSide(gBattleStruct->scriptingActive);
  15546.     gBattleTextBuff1[0] = 0xFD;
  15547.     gBattleTextBuff1[1] = 9;
  15548.     gBattleTextBuff1[2] = gBattleMons[gBattleStruct->scriptingActive].ability;
  15549.     gBattleTextBuff1[3] = 0xFF;
  15550.  
  15551.     for (;gBankTarget < gBattlersCount; gBankTarget++)
  15552.     {
  15553.         if (GetBattlerSide(gBankTarget) == side)
  15554.             continue;
  15555.         if (!(gAbsentBattlerFlags & gBitTable[gBankTarget]))
  15556.             break;
  15557.     }
  15558.  
  15559.     if (gBankTarget >= gBattlersCount)
  15560.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15561.     else
  15562.         gBattlescriptCurrInstr += 5;
  15563. }
  15564.  
  15565. static void atkE2_switchoutabilities(void)
  15566. {
  15567.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  15568.     switch (gBattleMons[gActiveBattler].ability)
  15569.     {
  15570.     case ABILITY_NATURAL_CURE:
  15571.         gBattleMons[gActiveBattler].status1 = 0;
  15572.         EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[ewram16064arr(gActiveBattler)], 4, &gBattleMons[gActiveBattler].status1);
  15573.         MarkBufferBankForExecution(gActiveBattler);
  15574.         break;
  15575.     }
  15576.     gBattlescriptCurrInstr += 2;
  15577. }
  15578.  
  15579. static void atkE3_jumpifhasnohp(void)
  15580. {
  15581.     gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
  15582.     if (gBattleMons[gActiveBattler].hp == 0)
  15583.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
  15584.     else
  15585.         gBattlescriptCurrInstr += 6;
  15586. }
  15587.  
  15588. static void atkE4_getsecretpowereffect(void)
  15589. {
  15590.     switch (gBattleTerrain)
  15591.     {
  15592.     case BATTLE_TERRAIN_GRASS:
  15593.         gBattleCommunication[MOVE_EFFECT_BYTE] = 2;
  15594.         break;
  15595.     case BATTLE_TERRAIN_LONG_GRASS:
  15596.         gBattleCommunication[MOVE_EFFECT_BYTE] = 1;
  15597.         break;
  15598.     case BATTLE_TERRAIN_SAND:
  15599.         gBattleCommunication[MOVE_EFFECT_BYTE] = 27;
  15600.         break;
  15601.     case BATTLE_TERRAIN_UNDERWATER:
  15602.         gBattleCommunication[MOVE_EFFECT_BYTE] = 23;
  15603.         break;
  15604.     case BATTLE_TERRAIN_WATER:
  15605.         gBattleCommunication[MOVE_EFFECT_BYTE] = 22;
  15606.         break;
  15607.     case BATTLE_TERRAIN_POND:
  15608.         gBattleCommunication[MOVE_EFFECT_BYTE] = 24;
  15609.         break;
  15610.     case BATTLE_TERRAIN_MOUNTAIN:
  15611.         gBattleCommunication[MOVE_EFFECT_BYTE] = 7;
  15612.         break;
  15613.     case BATTLE_TERRAIN_CAVE:
  15614.         gBattleCommunication[MOVE_EFFECT_BYTE] = 8;
  15615.         break;
  15616.     default:
  15617.         gBattleCommunication[MOVE_EFFECT_BYTE] = 5;
  15618.         break;
  15619.     }
  15620.     gBattlescriptCurrInstr++;
  15621. }
  15622.  
  15623. static void atkE5_pickup(void)
  15624. {
  15625.     int i;
  15626.     for (i = 0; i < 6; i++)
  15627.     {
  15628.         u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
  15629.         u16 held_item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
  15630.             u8 level = (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) - 1) / 10;
  15631.         u8 ability;
  15632.         if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY))
  15633.             ability = gBaseStats[species].ability2;
  15634.         else
  15635.             ability = gBaseStats[species].ability1;
  15636.  
  15637.         if (ability == ABILITY_PICKUP && species != 0 && species != SPECIES_EGG && held_item == 0 && (Random() % 10) == 0)
  15638.         {
  15639.             s32 chance = Random() % 100;
  15640.             s32 j;
  15641.             for (j = 0; j < 18; j += 2)
  15642.             {
  15643.                 if (sPickupTables[level][j + 1] > chance)
  15644.                     break;
  15645.             }
  15646.             SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, (const void*) &((sPickupTables[level])[j]));
  15647.         }
  15648.     }
  15649.     gBattlescriptCurrInstr++;
  15650. }
  15651.  
  15652. static void atkE6_docastformchangeanimation(void)
  15653. {
  15654.     gActiveBattler = gBattleStruct->scriptingActive;
  15655.     if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE)
  15656.         gBattleStruct->castformToChangeInto |= 0x80;
  15657.     EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, gBattleStruct->castformToChangeInto);
  15658.     MarkBufferBankForExecution(gActiveBattler);
  15659.     gBattlescriptCurrInstr++;
  15660. }
  15661.  
  15662. static void atkE7_trycastformdatachange(void)
  15663. {
  15664.     u8 form;
  15665.     gBattlescriptCurrInstr++;
  15666.     form = CastformDataTypeChange(gBattleStruct->scriptingActive);
  15667.     if (form)
  15668.     {
  15669.         BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
  15670.         gBattleStruct->castformToChangeInto = form - 1;
  15671.     }
  15672. }
  15673.  
  15674. static void atkE8_settypebasedhalvers(void) //water/mud sport
  15675. {
  15676.     bool8 worked = FALSE;
  15677.     if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT)
  15678.     {
  15679.         if (!(gStatuses3[gBankAttacker] & STATUS3_MUDSPORT))
  15680.         {
  15681.             gStatuses3[gBankAttacker] |= STATUS3_MUDSPORT;
  15682.             gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  15683.             worked = TRUE;
  15684.         }
  15685.     }
  15686.     else //water sport
  15687.     {
  15688.         if (!(gStatuses3[gBankAttacker] & STATUS3_WATERSPORT))
  15689.         {
  15690.             gStatuses3[gBankAttacker] |= STATUS3_WATERSPORT;
  15691.             gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  15692.             worked = TRUE;
  15693.         }
  15694.     }
  15695.     if (worked)
  15696.         gBattlescriptCurrInstr += 5;
  15697.     else
  15698.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15699. }
  15700.  
  15701. static void atkE9_setweatherballtype(void)
  15702. {
  15703.     if (WEATHER_HAS_EFFECT)
  15704.     {
  15705.         if ((u8)(gBattleWeather))
  15706.             gBattleStruct->dmgMultiplier = 2;
  15707.         if (gBattleWeather & WEATHER_RAIN_ANY)
  15708.             gBattleStruct->dynamicMoveType = TYPE_WATER | 0x80;
  15709.         else if (gBattleWeather & WEATHER_SANDSTORM_ANY)
  15710.             gBattleStruct->dynamicMoveType = TYPE_ROCK | 0x80;
  15711.         else if (gBattleWeather & WEATHER_SUN_ANY)
  15712.             gBattleStruct->dynamicMoveType = TYPE_FIRE | 0x80;
  15713.         else if (gBattleWeather & WEATHER_HAIL)
  15714.             gBattleStruct->dynamicMoveType = TYPE_ICE | 0x80;
  15715.         else
  15716.             gBattleStruct->dynamicMoveType = TYPE_NORMAL | 0x80;
  15717.     }
  15718.     gBattlescriptCurrInstr++;
  15719. }
  15720.  
  15721. static void atkEA_tryrecycleitem(void)
  15722. {
  15723.     u16* used_item;
  15724.     gActiveBattler = gBankAttacker;
  15725.     used_item = USED_HELD_ITEM(gActiveBattler);
  15726.     if (*used_item && gBattleMons[gActiveBattler].item == 0)
  15727.     {
  15728.         gLastUsedItem = *used_item;
  15729.         *used_item = 0;
  15730.         gBattleMons[gActiveBattler].item = gLastUsedItem;
  15731.         EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item);
  15732.         MarkBufferBankForExecution(gActiveBattler);
  15733.         gBattlescriptCurrInstr += 5;
  15734.     }
  15735.     else
  15736.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15737. }
  15738.  
  15739. static void atkEB_settypetoterrain(void)
  15740. {
  15741.     if (gBattleMons[gBankAttacker].type1 != sTerrainToType[gBattleTerrain] && gBattleMons[gBankAttacker].type2 != sTerrainToType[gBattleTerrain])
  15742.     {
  15743.         gBattleMons[gBankAttacker].type1 = sTerrainToType[gBattleTerrain];
  15744.         gBattleMons[gBankAttacker].type2 = sTerrainToType[gBattleTerrain];
  15745.         gBattleTextBuff1[0] = 0xFD;
  15746.         gBattleTextBuff1[1] = 3;
  15747.         gBattleTextBuff1[2] = sTerrainToType[gBattleTerrain];
  15748.         gBattleTextBuff1[3] = 0xFF;
  15749.         gBattlescriptCurrInstr += 5;
  15750.     }
  15751.     else
  15752.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15753. }
  15754.  
  15755. static void atkEC_pursuitrelated(void)
  15756. {
  15757.     gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2);
  15758.     if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]) && gActionForBanks[gActiveBattler] == 0 && gChosenMovesByBanks[gActiveBattler] == MOVE_PURSUIT)
  15759.     {
  15760.         gActionsByTurnOrder[gActiveBattler] = 11;
  15761.         gCurrentMove = MOVE_PURSUIT;
  15762.         gBattlescriptCurrInstr += 5;
  15763.         gBattleStruct->animTurn = 1;
  15764.         gBattleStruct->unk160A7 = gBankAttacker;
  15765.         gBankAttacker = gActiveBattler;
  15766.     }
  15767.     else
  15768.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15769. }
  15770.  
  15771. static void atkED_snatchsetbanks(void)
  15772. {
  15773.     gEffectBank = gBankAttacker;
  15774.     if (gBankAttacker == gBankTarget)
  15775.         gBankAttacker = gBankTarget = gBattleStruct->scriptingActive;
  15776.     else
  15777.         gBankTarget = gBattleStruct->scriptingActive;
  15778.     gBattleStruct->scriptingActive = gEffectBank;
  15779.     gBattlescriptCurrInstr++;
  15780. }
  15781.  
  15782. static void atkEE_removelightscreenreflect(void) //brick break
  15783. {
  15784.     u8 side = GetBattlerSide(gBankAttacker) ^ 1;
  15785.     if (gSideTimers[side].reflectTimer || gSideTimers[side].lightscreenTimer)
  15786.     {
  15787.         gSideAffecting[side] &= ~(SIDE_STATUS_REFLECT);
  15788.         gSideAffecting[side] &= ~(SIDE_STATUS_LIGHTSCREEN);
  15789.         gSideTimers[side].reflectTimer = 0;
  15790.         gSideTimers[side].lightscreenTimer = 0;
  15791.         gBattleStruct->animTurn = 1;
  15792.         gBattleStruct->animTargetsHit = 1;
  15793.     }
  15794.     else
  15795.     {
  15796.         gBattleStruct->animTurn = 0;
  15797.         gBattleStruct->animTargetsHit = 0;
  15798.     }
  15799.     gBattlescriptCurrInstr++;
  15800. }
  15801.  
  15802. void atkEF_handleballthrow(void)
  15803. {
  15804.     u8 ball_multiplier = 0;
  15805.     if (gBattleExecBuffer)
  15806.         return;
  15807.  
  15808.     gActiveBattler = gBankAttacker;
  15809.     gBankTarget = gBankAttacker ^ 1;
  15810.     if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
  15811.     {
  15812.         EmitBallThrow(0, 5);
  15813.         MarkBufferBankForExecution(gActiveBattler);
  15814.         gBattlescriptCurrInstr = BattleScript_TrainerBallBlock;
  15815.     }
  15816.     else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
  15817.     {
  15818.         EmitBallThrow(0, 4);
  15819.         MarkBufferBankForExecution(gActiveBattler);
  15820.         gBattlescriptCurrInstr = BattleScript_WallyBallThrow;
  15821.     }
  15822.     else
  15823.     {
  15824.         u32 odds;
  15825.         u8 catch_rate;
  15826.         if (gLastUsedItem == ITEM_SAFARI_BALL)
  15827.             catch_rate = gBattleStruct->unk16089 * 1275 / 100; //correct the name to safariFleeRate
  15828.         else
  15829.             catch_rate = gBaseStats[gBattleMons[gBankTarget].species].catchRate;
  15830.         if (gLastUsedItem > 5)
  15831.         {
  15832.             switch (gLastUsedItem)
  15833.             {
  15834.             case ITEM_NET_BALL:
  15835.                 if (gBattleMons[gBankTarget].type1 == TYPE_WATER || gBattleMons[gBankTarget].type2 == TYPE_WATER || gBattleMons[gBankTarget].type1 == TYPE_BUG || gBattleMons[gBankTarget].type2 == TYPE_BUG)
  15836.                     ball_multiplier = 30;
  15837.                 else
  15838.                     ball_multiplier = 10;
  15839.                 break;
  15840.             case ITEM_DIVE_BALL:
  15841.                 if (Overworld_GetMapTypeOfSaveblockLocation() == 5)
  15842.                     ball_multiplier = 35;
  15843.                 else
  15844.                     ball_multiplier = 10;
  15845.                 break;
  15846.             case ITEM_NEST_BALL:
  15847.                 if (gBattleMons[gBankTarget].level <= 39)
  15848.                 {
  15849.                     ball_multiplier = 40 - gBattleMons[gBankTarget].level;
  15850.                     if (ball_multiplier <= 9)
  15851.                         ball_multiplier = 10;
  15852.                 }
  15853.                 else
  15854.                     ball_multiplier = 10;
  15855.                 break;
  15856.             case ITEM_REPEAT_BALL:
  15857.                 if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1))
  15858.                     ball_multiplier = 30;
  15859.                 else
  15860.                     ball_multiplier = 10;
  15861.                 break;
  15862.             case ITEM_TIMER_BALL:
  15863.                 ball_multiplier = gBattleResults.battleTurnCounter + 10;
  15864.                 if (ball_multiplier > 40)
  15865.                     ball_multiplier = 40;
  15866.                 break;
  15867.             case ITEM_LUXURY_BALL:
  15868.             case ITEM_PREMIER_BALL:
  15869.                 ball_multiplier = 10;
  15870.                 break;
  15871.             }
  15872.         }
  15873.         else
  15874.             ball_multiplier = sBallCatchBonuses[gLastUsedItem - 2];
  15875.  
  15876.         odds = (catch_rate * ball_multiplier / 10) * (gBattleMons[gBankTarget].maxHP * 3 - gBattleMons[gBankTarget].hp * 2) / (3 * gBattleMons[gBankTarget].maxHP);
  15877.         if (gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE))
  15878.             odds *= 2;
  15879.         if (gBattleMons[gBankTarget].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS /*| STATUS_TOXIC_POISON */)) //nice one gf
  15880.             odds = (odds * 15) / 10;
  15881.  
  15882.         if (gLastUsedItem != ITEM_SAFARI_BALL)
  15883.         {
  15884.             if (gLastUsedItem == ITEM_MASTER_BALL)
  15885.             {
  15886.                 gBattleResults.unk5_1 = 1;
  15887.             }
  15888.             else
  15889.             {
  15890.                 if (gBattleResults.usedBalls[gLastUsedItem - ITEM_ULTRA_BALL] < 0xFF)
  15891.                     gBattleResults.usedBalls[gLastUsedItem - ITEM_ULTRA_BALL]++;
  15892.             }
  15893.         }
  15894.         if (odds > 254) //poke caught
  15895.         {
  15896.             EmitBallThrow(0, 4);
  15897.             MarkBufferBankForExecution(gActiveBattler);
  15898.             gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;
  15899.             SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem);
  15900.             if (CalculatePlayerPartyCount() == 6)
  15901.                 gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  15902.             else
  15903.                 gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  15904.         }
  15905.         else //poke may be caught, calculate shakes
  15906.         {
  15907.             u8 shakes;
  15908.             odds = Sqrt(Sqrt(16711680 / odds));
  15909.             odds = 1048560 / odds;
  15910.             for (shakes = 0; shakes < 4 && Random() < odds; shakes++) {}
  15911.             if (gLastUsedItem == ITEM_MASTER_BALL)
  15912.                 shakes = 4; //why calculate the shakes before that check?
  15913.             EmitBallThrow(0, shakes);
  15914.             MarkBufferBankForExecution(gActiveBattler);
  15915.             if (shakes == 4) //poke caught, copy of the code above
  15916.             {
  15917.                 gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;
  15918.                 SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem);
  15919.                 if (CalculatePlayerPartyCount() == 6)
  15920.                     gBattleCommunication[MULTISTRING_CHOOSER] = 0;
  15921.                 else
  15922.                     gBattleCommunication[MULTISTRING_CHOOSER] = 1;
  15923.             }
  15924.             else //rip
  15925.             {
  15926.                 gBattleCommunication[MULTISTRING_CHOOSER] = shakes;
  15927.                 gBattlescriptCurrInstr = BattleScript_ShakeBallThrow;
  15928.             }
  15929.         }
  15930.     }
  15931. }
  15932.  
  15933. static void atkF0_givecaughtmon(void)
  15934. {
  15935.     GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]]);
  15936.     gBattleResults.caughtPoke = gBattleMons[gBankAttacker ^ 1].species;
  15937.     GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleResults.caughtNick);
  15938.     gBattlescriptCurrInstr++;
  15939. }
  15940.  
  15941. static void atkF1_trysetcaughtmondexflags(void)
  15942. {
  15943.     if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1))
  15944.         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  15945.     else
  15946.     {
  15947.         GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3);
  15948.         if (gBattleMons[gBankTarget].species == SPECIES_UNOWN)
  15949.             gSaveBlock2.pokedex.unownPersonality = gBattleMons[gBankTarget].personality;
  15950.         if (gBattleMons[gBankTarget].species == SPECIES_SPINDA) //else if
  15951.             gSaveBlock2.pokedex.spindaPersonality = gBattleMons[gBankTarget].personality;
  15952.         gBattlescriptCurrInstr += 5;
  15953.     }
  15954. }
  15955.  
  15956. extern const u32 gBattleTerrainTiles_Building[];
  15957. extern const u32 gBattleTerrainTilemap_Building[];
  15958. extern const u32 gBattleTerrainPalette_BattleTower[];
  15959.  
  15960. static void atkF2_displaydexinfo(void)
  15961. {
  15962.     switch (gBattleCommunication[0])
  15963.     {
  15964.     case 0:
  15965.         BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));
  15966.         gBattleCommunication[0]++;
  15967.         break;
  15968.     case 1:
  15969.         if (!gPaletteFade.active)
  15970.         {
  15971.             gBattleCommunication[1] = sub_809070C(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), gBattleMons[gBankTarget].otId, gBattleMons[gBankTarget].personality);
  15972.             gBattleCommunication[0]++;
  15973.         }
  15974.         break;
  15975.     case 2:
  15976.         if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2 && !gTasks[gBattleCommunication[1]].isActive)
  15977.         {
  15978.             LZDecompressVram(gBattleTerrainTiles_Building, (void*)(0x06008000));
  15979.             LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(0x0600d000));
  15980.             LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60);
  15981.             REG_BG3CNT = 0x5a0b;
  15982.             gBattle_BG3_X = 0x100;
  15983.             BeginNormalPaletteFade(0xFFFC, 0, 16, 0, RGB(0, 0, 0));
  15984.             gBattleCommunication[0]++;
  15985.         }
  15986.         break;
  15987.     case 3:
  15988.         if (!gPaletteFade.active)
  15989.             gBattlescriptCurrInstr++;
  15990.         break;
  15991.     }
  15992. }
  15993.  
  15994. NAKED
  15995. void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0)
  15996. {
  15997.     asm(".syntax unified\n\
  15998.    push {r4-r7,lr}\n\
  15999.    mov r7, r10\n\
  16000.    mov r6, r9\n\
  16001.    mov r5, r8\n\
  16002.    push {r5-r7}\n\
  16003.    ldr r4, [sp, 0x20]\n\
  16004.    lsls r0, 24\n\
  16005.    lsrs r6, r0, 24\n\
  16006.    lsls r1, 24\n\
  16007.    lsrs r1, 24\n\
  16008.    mov r12, r1\n\
  16009.    lsls r2, 24\n\
  16010.    lsrs r5, r2, 24\n\
  16011.    lsls r3, 24\n\
  16012.    lsrs r7, r3, 24\n\
  16013.    lsls r4, 24\n\
  16014.    lsrs r4, 24\n\
  16015.    mov r8, r4\n\
  16016.    mov r2, r12\n\
  16017.    cmp r2, r7\n\
  16018.    bgt _0802BC5A\n\
  16019.    lsls r1, r6, 1\n\
  16020.    ldr r0, _0802BC20 @ =0x0600c000\n\
  16021.    adds r1, r0\n\
  16022.    mov r9, r1\n\
  16023. _0802BC06:\n\
  16024.    adds r1, r6, 0\n\
  16025.    adds r0, r2, 0x1\n\
  16026.    mov r10, r0\n\
  16027.    cmp r1, r5\n\
  16028.    bgt _0802BC54\n\
  16029.    lsls r0, r2, 6\n\
  16030.    mov r4, r9\n\
  16031.    adds r3, r4, r0\n\
  16032. _0802BC16:\n\
  16033.    cmp r2, r12\n\
  16034.    bne _0802BC28\n\
  16035.    ldr r0, _0802BC24 @ =0x00001022\n\
  16036.    b _0802BC36\n\
  16037.    .align 2, 0\n\
  16038. _0802BC20: .4byte 0x0600c000\n\
  16039. _0802BC24: .4byte 0x00001022\n\
  16040. _0802BC28:\n\
  16041.    cmp r2, r7\n\
  16042.    bne _0802BC34\n\
  16043.    ldr r0, _0802BC30 @ =0x00001028\n\
  16044.    b _0802BC36\n\
  16045.    .align 2, 0\n\
  16046. _0802BC30: .4byte 0x00001028\n\
  16047. _0802BC34:\n\
  16048.    ldr r0, _0802BC68 @ =0x00001025\n\
  16049. _0802BC36:\n\
  16050.    cmp r1, r6\n\
  16051.    beq _0802BC42\n\
  16052.    adds r0, 0x1\n\
  16053.    cmp r1, r5\n\
  16054.    bne _0802BC42\n\
  16055.    adds r0, 0x1\n\
  16056. _0802BC42:\n\
  16057.    mov r4, r8\n\
  16058.    cmp r4, 0\n\
  16059.    beq _0802BC4A\n\
  16060.    movs r0, 0\n\
  16061. _0802BC4A:\n\
  16062.    strh r0, [r3]\n\
  16063.    adds r3, 0x2\n\
  16064.    adds r1, 0x1\n\
  16065.    cmp r1, r5\n\
  16066.    ble _0802BC16\n\
  16067. _0802BC54:\n\
  16068.    mov r2, r10\n\
  16069.    cmp r2, r7\n\
  16070.    ble _0802BC06\n\
  16071. _0802BC5A:\n\
  16072.    pop {r3-r5}\n\
  16073.    mov r8, r3\n\
  16074.    mov r9, r4\n\
  16075.    mov r10, r5\n\
  16076.    pop {r4-r7}\n\
  16077.    pop {r0}\n\
  16078.    bx r0\n\
  16079.    .align 2, 0\n\
  16080. _0802BC68: .4byte 0x00001025\n\
  16081.        .syntax divided");
  16082. }
  16083.  
  16084. void sub_802BC6C(void)
  16085. {
  16086.     MenuCursor_SetPos814A880(0xC8, ((gBattleCommunication[1] << 28) + 1207959552) >> 24); //what could that be?
  16087. }
  16088.  
  16089. void nullsub_6(void)
  16090. {
  16091.     return;
  16092. }
  16093.  
  16094. static void atkF3_trygivecaughtmonnick(void)
  16095. {
  16096.     switch (gBattleCommunication[0])
  16097.     {
  16098.     case 0:
  16099.         sub_8023A80();
  16100.         gBattleCommunication[0]++;
  16101.         gBattleCommunication[1] = 0;
  16102.         sub_802BC6C();
  16103.         break;
  16104.     case 1:
  16105.         if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0)
  16106.         {
  16107.             PlaySE(SE_SELECT);
  16108.             nullsub_6();
  16109.             gBattleCommunication[1] = 0;
  16110.             sub_802BC6C();
  16111.         }
  16112.         if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0)
  16113.         {
  16114.             PlaySE(SE_SELECT);
  16115.             nullsub_6();
  16116.             gBattleCommunication[1] = 1;
  16117.             sub_802BC6C();
  16118.         }
  16119.         if (gMain.newKeys & A_BUTTON)
  16120.         {
  16121.             PlaySE(SE_SELECT);
  16122.             if (gBattleCommunication[1] == 0)
  16123.             {
  16124.                 gBattleCommunication[0]++;
  16125.                 BeginFastPaletteFade(3);
  16126.             }
  16127.             else
  16128.                 gBattleCommunication[0] = 4;
  16129.         }
  16130.         else if (gMain.newKeys & B_BUTTON)
  16131.         {
  16132.             PlaySE(SE_SELECT);
  16133.             gBattleCommunication[0] = 4;
  16134.         }
  16135.         break;
  16136.     case 2:
  16137.         if (!gPaletteFade.active)
  16138.         {
  16139.             GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleStruct->caughtNick);
  16140.             DoNamingScreen(2, gBattleStruct->caughtNick, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), BattleMainCB2);
  16141.             gBattleCommunication[0]++;
  16142.         }
  16143.         break;
  16144.     case 3:
  16145.         if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active )
  16146.         {
  16147.             SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleStruct->caughtNick);
  16148.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  16149.         }
  16150.         break;
  16151.     case 4:
  16152.         if (CalculatePlayerPartyCount() == 6)
  16153.             gBattlescriptCurrInstr += 5;
  16154.         else
  16155.             gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
  16156.         break;
  16157.     }
  16158. }
  16159.  
  16160. static void atkF4_subattackerhpbydmg(void)
  16161. {
  16162.     gBattleMons[gBankAttacker].hp -= gBattleMoveDamage;
  16163.     gBattlescriptCurrInstr++;
  16164. }
  16165.  
  16166. static void atkF5_removeattackerstatus1(void)
  16167. {
  16168.     gBattleMons[gBankAttacker].status1 = 0;
  16169.     gBattlescriptCurrInstr++;
  16170. }
  16171.  
  16172. static void atkF6_finishaction(void)
  16173. {
  16174.     gCurrentActionFuncId = 0xC;
  16175. }
  16176.  
  16177. static void atkF7_finishturn(void)
  16178. {
  16179.     gCurrentActionFuncId = 0xC;
  16180.     gCurrentTurnActionNumber = gBattlersCount;
  16181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement