diff options
Diffstat (limited to 'src/battle/battle_4.c')
-rw-r--r-- | src/battle/battle_4.c | 14789 |
1 files changed, 0 insertions, 14789 deletions
diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c deleted file mode 100644 index dab6ce1f0..000000000 --- a/src/battle/battle_4.c +++ /dev/null @@ -1,14789 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_message.h" -#include "battle_string_ids.h" -#include "battle_script_commands.h" -#include "battle_util.h" -#include "constants/battle_move_effects.h" -#include "constants/moves.h" -#include "constants/abilities.h" -#include "item.h" -#include "constants/items.h" -#include "data2.h" -#include "constants/hold_effects.h" -#include "random.h" -#include "rom3.h" -#include "constants/species.h" -#include "pokemon.h" -#include "text.h" -#include "palette.h" -#include "main.h" -#include "constants/songs.h" -#include "sound.h" -#include "task.h" -#include "decompress.h" -#include "pokemon_summary_screen.h" -#include "naming_screen.h" -#include "ewram.h" -#include "util.h" - -// TODO: put this into battle_controllers.h - -#define RET_VALUE_LEVELLED_UP 11 - -enum -{ - CONTROLLER_GETMONDATA, - CONTROLLER_GETRAWMONDATA, - CONTROLLER_SETMONDATA, - CONTROLLER_SETRAWMONDATA, - CONTROLLER_LOADMONSPRITE, - CONTROLLER_SWITCHINANIM, - CONTROLLER_RETURNMONTOBALL, - CONTROLLER_DRAWTRAINERPIC, - CONTROLLER_TRAINERSLIDE, - CONTROLLER_TRAINERSLIDEBACK, - CONTROLLER_FAINTANIMATION, - CONTROLLER_PALETTEFADE, - CONTROLLER_SUCCESSBALLTHROWANIM, - CONTROLLER_BALLTHROWANIM, - CONTROLLER_PAUSE, - CONTROLLER_MOVEANIMATION, - CONTROLLER_PRINTSTRING, - CONTROLLER_PRINTSTRINGPLAYERONLY, - CONTROLLER_CHOOSEACTION, - CONTROLLER_UNKNOWNYESNOBOX, - CONTROLLER_CHOOSEMOVE, - CONTROLLER_OPENBAG, - CONTROLLER_CHOOSEPOKEMON, - CONTROLLER_23, - CONTROLLER_HEALTHBARUPDATE, - CONTROLLER_EXPUPDATE, - CONTROLLER_STATUSICONUPDATE, - CONTROLLER_STATUSANIMATION, - CONTROLLER_STATUSXOR, - CONTROLLER_DATATRANSFER, - CONTROLLER_DMA3TRANSFER, - CONTROLLER_31, - CONTROLLER_32, - CONTROLLER_TWORETURNVALUES, - CONTROLLER_CHOSENMONRETURNVALUE, - CONTROLLER_ONERETURNVALUE, - CONTROLLER_ONERETURNVALUE_DUPLICATE, - CONTROLLER_37, - CONTROLLER_38, - CONTROLLER_39, - CONTROLLER_40, - CONTROLLER_HITANIMATION, - CONTROLLER_42, - CONTROLLER_EFFECTIVENESSSOUND, - CONTROLLER_PLAYFANFAREORBGM, - CONTROLLER_FAINTINGCRY, - CONTROLLER_INTROSLIDE, - CONTROLLER_INTROTRAINERBALLTHROW, - CONTROLLER_DRAWPARTYSTATUSSUMMARY, - CONTROLLER_49, - CONTROLLER_50, - CONTROLLER_SPRITEINVISIBILITY, - CONTROLLER_BATTLEANIMATION, - CONTROLLER_LINKSTANDBYMSG, - CONTROLLER_RESETACTIONMOVESELECTION, - CONTROLLER_55, - /*new controllers should go here*/ - CONTROLLER_TERMINATOR_NOP, - CONTROLLER_CMDS_COUNT -}; - -//extern needed variables -extern u8 gUnknown_02023A14_50; -extern u8 gCritMultiplier; -extern s32 gBattleMoveDamage; -extern u32 gStatuses3[MAX_BATTLERS_COUNT]; -extern u16 gBattleTypeFlags; -extern const struct BaseStats gBaseStats[]; -extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT]; -extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT]; -extern u8 gActiveBattler; -extern u32 gBattleExecBuffer; -extern u8 gBattlersCount; -extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT]; -extern u8 gBanksByTurnOrder[MAX_BATTLERS_COUNT]; -extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT]; -extern u16 gCurrentMove; -extern u8 gLastUsedAbility; -extern u16 gBattleWeather; -extern u8 gStringBank; -extern u8 gEffectBank; -extern u8 gAbsentBattlerFlags; -extern u8 gMultiHitCounter; -extern u16 gLastUsedMove[4]; -extern u16 gLockedMoves[4]; -extern u16 gChosenMovesByBanks[4]; -extern u16 gSideAffecting[2]; -extern u16 gPauseCounterBattle; -extern u16 gPaydayMoney; -extern u16 gRandomTurnNumber; -extern u8 gBattleOutcome; -extern u8 gBattleTerrain; -extern u16 gTrainerBattleOpponent; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern const u8* gBattlescriptCurrInstr; -extern u8 gCurrMovePos; -extern u8 gCurrentActionFuncId; -extern u32 gHitMarker; -extern u8 gMoveResultFlags; -extern u8 gBattleCommunication[]; -extern u16 gLastLandedMoves[4]; -extern u16 gLastHitByType[4]; -extern u8 gStringBank; -extern u16 gDynamicBasePower; -extern const u8 gTypeEffectiveness[]; -extern u16 gLastUsedItem; -extern u16 gBattleMovePower; -extern s32 gHpDealt; -extern s32 gTakenDmg[MAX_BATTLERS_COUNT]; -extern u8 gTakenDmgBanks[MAX_BATTLERS_COUNT]; -extern const u16 gMissStringIds[]; -extern u8 gSentPokesToOpponent[2]; -extern u8 gBank1; -extern u16 gExpShareExp; -extern u8 gBattleTextBuff1[]; -extern u8 gBattleTextBuff2[]; -extern u8 gBattleTextBuff3[]; -extern u8 gLeveledUpInBattle; -extern void (*gBattleMainFunc)(void); -extern struct Window gUnknown_03004210; -extern const u8 BattleText_YesNo[]; -extern u8 gPlayerPartyCount; -extern u16 gMoveToLearn; //move to learn -extern const u8 gTrainerMoney[]; -extern u16 gRandomMove; -extern u8* gBattleScriptsForMoveEffects[]; -extern u16 gChosenMove; //last used move in battle -extern u8 gBankInMenu; -extern u8 gActionForBanks[4]; -extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch -extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one -extern u8 gCurrentTurnActionNumber; -extern u16 gTrappingMoves[]; - -extern u8 BattleScript_MoveEffectSleep[]; -extern u8 BattleScript_MoveEffectPoison[]; -extern u8 BattleScript_MoveEffectBurn[]; -extern u8 BattleScript_MoveEffectFreeze[]; -extern u8 BattleScript_MoveEffectParalysis[]; -extern u8 BattleScript_MoveEffectToxic[]; -extern u8 BattleScript_MoveEffectConfusion[]; -extern u8 BattleScript_MoveEffectUproar[]; -extern u8 BattleScript_MoveEffectWrap[]; -extern u8 BattleScript_MoveEffectPayDay[]; -extern u8 BattleScript_MoveEffectRecoil33[]; - -//extern functions -u8 AtkCanceller_UnableToUseMove(void); -void PressurePPLose(u8 bank_atk, u8 bank_def, u16 move); -void CancelMultiTurnMoves(u8 bank); -void BattleScriptPush(const u8* BS_ptr); -void BattleScriptPushCursor(void); -void RecordAbilityBattle(u8 bank, u8 ability); -void RecordItemBattle(u8 bank, u8 holdEffect); -static bool8 IsTwoTurnsMove(u16 move); -static void TrySetDestinyBondToHappen(void); -static void CheckWonderGuardAndLevitate(void); -u8 GetBattlerPosition(u8 bank); -u8 GetBattlerSide(u8 bank); -u8 GetBattleBank(u8 bankValue); -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); -static u8 AttacksThisTurn(u8 bank, u16 move); //Note: returns 1 if it's a charging turn, otherwise 2 -void UndoEffectsAfterFainting(void); -void BattleStopLowHpSound(void); -void PlayBGM(u16 songID); -void MonGainEVs(struct Pokemon*, u16 defeatedSpecies); -extern u8 gBattleBufferB[4][0x200]; -void HandleLowHpMusicChange(struct Pokemon*, u8 bank); -bool8 IsTradedMon(struct Pokemon*); -void BattleScriptPop(void); -void SwitchInClearSetData(void); -u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8); -u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); -u16 SpeciesToNationalPokedexNum(u16 species); -u8 sub_803FC34(u8 bank); -u16 sub_803FBFC(u8 a); -u8 GetBattlerAtPosition(u8 ID); -void sub_8012258(u8); -//MonTryLearningNewMove teach poke a move -u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); -void IncrementGameStat(u8 index); -u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); -u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight); -u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); -void DestroyMenuCursor(void); -void sub_802BC6C(void); -u8 sub_809FA30(void); -bool32 IsHMMove2(u16 move); -void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0); -void nullsub_6(void); -void ReshowBattleScreenAfterMenu(void); -void BattleMainCB2(void); -void AddMoney(u32* moneySaveblock, u32 to_give); -u8 CountAliveMons(u8 caseID); -void PokemonUseItemEffects(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); -u8 CanRunFromBattle(void); -u8 GetMoveTarget(u16 move, u8 targetbyte); //get target of move -u8 CastformDataTypeChange(u8 bank); -u8 Overworld_GetMapTypeOfSaveblockLocation(void); -u8 CalculatePlayerPartyCount(void); -u16 Sqrt(u32 num); -u8 sub_809070C(u16 nationalNum, u32 TiD, u32 PiD); //task prepare poke dex display -void MenuCursor_SetPos814A880(u8 a1, u8 a2); -u8 CheckMoveLimitations(u8 bank, u8 unusable_moves, u8 flags); -bool8 IsLinkDoubleBattle(void); -void sub_8094B6C(u8 bank, u8 partyID, u8 r2); - -//extern BattleScripts -extern u8 BattleScript_MoveEnd[]; -extern u8 BattleScript_NoPPForMove[]; -extern u8 BattleScript_MagicCoatBounce[]; -extern u8 BattleScript_TookAttack[]; -extern u8 BattleScript_SnatchedMove[]; -extern u8 BattleScript_Pausex20[]; -extern u8 BattleScript_SubstituteFade[]; -extern u8 BattleScript_HangedOnMsg[]; -extern u8 BattleScript_OneHitKOMsg[]; -extern u8 BattleScript_EnduredMsg[]; -extern u8 BattleScript_PSNPrevention[]; -extern u8 BattleScript_BRNPrevention[]; -extern u8 BattleScript_PRLZPrevention[]; -extern u8 BattleScript_FlinchPrevention[]; -extern u8 BattleScript_StatUp[]; -extern u8 BattleScript_StatDown[]; -extern u8 BattleScript_NoItemSteal[]; -extern u8 BattleScript_ItemSteal[]; -extern u8 BattleScript_RapidSpinAway[]; -extern u8 BattleScript_TargetPRLZHeal[]; -extern u8 BattleScript_KnockedOff[]; -extern u8 BattleScript_LevelUp[]; -extern u8 BattleScript_WrapFree[]; -extern u8 BattleScript_LeechSeedFree[]; -extern u8 BattleScript_SpikesFree[]; -extern u8 BattleScript_ButItFailed[]; -extern u8 BattleScript_ObliviousPreventsAttraction[]; -extern u8 BattleScript_MistProtected[]; -extern u8 BattleScript_AbilityNoStatLoss[]; -extern u8 BattleScript_AbilityNoSpecificStatLoss[]; -extern u8 BattleScript_TrainerBallBlock[]; -extern u8 BattleScript_WallyBallThrow[]; -extern u8 BattleScript_SuccessBallThrow[]; -extern u8 BattleScript_ShakeBallThrow[]; -extern u8 BattleScript_AllStatsUp[]; -extern u8 BattleScript_AtkDefDown[]; -extern u8 BattleScript_SAtkDown2[]; - -extern u8 BattleScript_SpikesOnTarget[]; //spikes1 -extern u8 BattleScript_SpikesOnAttacker[]; //spikes2 -extern u8 BattleScript_SpikesOngBank1[]; //spikes3 -extern u8 BattleScript_HitFromCritCalc[]; //present dmg -extern u8 BattleScript_AlreadyAtFullHp[]; //present full hp -extern u8 BattleScript_PresentHealTarget[]; //present hp heal -extern u8 BattleScript_MoveMissedPause[]; -extern u8 BattleScript_CastformChange[]; -extern u8 BattleScript_DampStopsExplosion[]; -extern u8 BattleScript_SuccessForceOut[]; //bs random switchout -extern u8 BattleScript_PrintPayDayMoneyString[]; //bs payday money give -extern u8 BattleScript_FaintAttacker[]; -extern u8 BattleScript_FaintTarget[]; -extern u8 BattleScript_DestinyBondTakesLife[]; -extern u8 BattleScript_SelectingImprisionedMoveInPalace[]; - -// read via orr -#define BSScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) -#define BSScriptRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) -#define BSScriptReadPtr(ptr) ((void *)BSScriptRead32(ptr)) - -// read via add -#define BS2ScriptRead32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) -#define BS2ScriptRead16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) -#define BS2ScriptReadPtr(ptr) ((void *)BS2ScriptRead32(ptr)) - -#define TARGET_PROTECT_AFFECTED ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_PROTECT)) - -//array entries for battle communication -#define MOVE_EFFECT_BYTE 0x3 -#define MULTISTRING_CHOOSER 0x5 -#define MSG_DISPLAY 0x7 - -#define TARGET_SELECTED 0x0 -#define TARGET_DEPENDS 0x1 -#define TARGET_BOTH 0x8 -#define TARGET_FOES_AND_ALLY 0x20 -#define TARGET_OPPONENTS_FIELD 0x40 - -#define TYPE_FORESIGHT 0xFE -#define TYPE_ENDTABLE 0xFF - -#define CMP_EQUAL 0x0 -#define CMP_NOT_EQUAL 0x1 -#define CMP_GREATER_THAN 0x2 -#define CMP_LESS_THAN 0x3 -#define CMP_COMMON_BITS 0x4 -#define CMP_NO_COMMON_BITS 0x5 - -#define uBYTE0_16(value)(( (u8) (((u16)(value) & (0x000000FF)) >> 0x00))) -#define uBYTE1_16(value)(( (u8) (((u16)(value) & (0x0000FF00)) >> 0x08))) - -#define uBYTE0_32(value)(( (u8) (((u32)(value) & (0x000000FF)) >> 0x00))) -#define uBYTE1_32(value)(( (u8) (((u32)(value) & (0x0000FF00)) >> 0x08))) -#define uBYTE2_32(value)(( (u8) (((u32)(value) & (0x00FF0000)) >> 0x10))) -#define uBYTE3_32(value)(( (u8) (((u32)(value) & (0xFF000000)) >> 0x18))) - -#define sBYTE0_16(value)(( (u8) (((s16)(value) & (0x000000FF)) >> 0x00))) -#define sBYTE1_16(value)(( (u8) (((s16)(value) & (0x0000FF00)) >> 0x08))) - -#define sBYTE0_32(value)(( (u8) (((s32)(value) & (0x000000FF)) >> 0x00))) -#define sBYTE1_32(value)(( (u8) (((s32)(value) & (0x0000FF00)) >> 0x08))) -#define sBYTE2_32(value)(( (u8) (((s32)(value) & (0x00FF0000)) >> 0x10))) -#define sBYTE3_32(value)(( (u8) (((s32)(value) & (0xFF000000)) >> 0x18))) - -#define RecordAbilitySetField6(ability, fieldValue) \ -(gLastUsedAbility = ability, gBattleCommunication[6] = fieldValue, RecordAbilityBattle(gBankTarget, ability)) - -#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special))) - -#define HP_ON_SWITCHOUT (((u16*)(ewram_addr + 0x160BC))) - -static void atk00_attackcanceler(void); -static void atk01_accuracycheck(void); -static void atk02_attackstring(void); -static void atk03_ppreduce(void); -static void atk04_critcalc(void); -static void atk05_damagecalc(void); -static void atk06_typecalc(void); -static void atk07_adjustnormaldamage(void); -static void atk08_adjustnormaldamage2(void); -static void atk09_attackanimation(void); -static void atk0A_waitanimation(void); -static void atk0B_healthbarupdate(void); -static void atk0C_datahpupdate(void); -static void atk0D_critmessage(void); -static void atk0E_effectivenesssound(void); -static void atk0F_resultmessage(void); -static void atk10_printstring(void); -static void atk11_printselectionstring(void); -static void atk12_waitmessage(void); -static void atk13_printfromtable(void); -static void atk14_printselectionstringfromtable(void); -static void atk15_seteffectwithchance(void); -static void atk16_seteffectprimary(void); -static void atk17_seteffectsecondary(void); -static void atk18_clearstatusfromeffect(void); -static void atk19_tryfaintmon(void); -static void atk1A_dofaintanimation(void); -static void atk1B_cleareffectsonfaint(void); -static void atk1C_jumpifstatus(void); -static void atk1D_jumpifstatus2(void); -static void atk1E_jumpifability(void); -static void atk1F_jumpifsideaffecting(void); -static void atk20_jumpifstat(void); -static void atk21_jumpifstatus3condition(void); -static void atk22_jumpiftype(void); -static void atk23_getexp(void); -static void atk24(void); -static void atk25_movevaluescleanup(void); -static void atk26_setmultihit(void); -static void atk27_decrementmultihit(void); -static void atk28_goto(void); -static void atk29_jumpifbyte(void); -static void atk2A_jumpifhalfword(void); -static void atk2B_jumpifword(void); -static void atk2C_jumpifarrayequal(void); -static void atk2D_jumpifarraynotequal(void); -static void atk2E_setbyte(void); -static void atk2F_addbyte(void); -static void atk30_subbyte(void); -static void atk31_copyarray(void); -static void atk32_copyarraywithindex(void); -static void atk33_orbyte(void); -static void atk34_orhalfword(void); -static void atk35_orword(void); -static void atk36_bicbyte(void); -static void atk37_bichalfword(void); -static void atk38_bicword(void); -static void atk39_pause(void); -static void atk3A_waitstate(void); -static void atk3B_healthbar_update(void); -static void atk3C_return(void); -static void atk3D_end(void); -static void atk3E_end2(void); -static void atk3F_end3(void); -static void atk40_jumpifaffectedbyprotect(void); -static void atk41_call(void); -static void atk42_jumpiftype2(void); -static void atk43_jumpifabilitypresent(void); -static void atk44_endselectionscript(void); -static void atk45_playanimation(void); -static void atk46_playanimation2(void); -static void atk47_setgraphicalstatchangevalues(void); -static void atk48_playstatchangeanimation(void); -void atk49_moveend(void); -static void atk4A_typecalc2(void); -static void atk4B_returnatktoball(void); -static void atk4C_getswitchedmondata(void); -static void atk4D_switchindataupdate(void); -static void atk4E_switchinanim(void); -static void atk4F_jumpifcantswitch(void); -static void atk50_openpartyscreen(void); -static void atk51_switchhandleorder(void); -static void atk52_switchineffects(void); -static void atk53_trainerslidein(void); -static void atk54_playse(void); -static void atk55_fanfare(void); -static void atk56_playfaintcry(void); -static void atk57(void); -static void atk58_returntoball(void); -void atk59_handlelearnnewmove(void); -static void atk5A_yesnoboxlearnmove(void); -static void atk5B_yesnoboxstoplearningmove(void); -static void atk5C_hitanimation(void); -static void atk5D_getmoneyreward(void); -static void atk5E_8025A70(void); -static void atk5F_8025B24(void); -static void atk60_incrementgamestat(void); -static void atk61_drawpartystatussummary(void); -static void atk62_08025C6C(void); -static void atk63_jumptorandomattack(void); -static void atk64_statusanimation(void); -static void atk65_status2animation(void); -static void atk66_chosenstatusanimation(void); -static void atk67_yesnobox(void); -static void atk68_cancelallactions(void); -static void atk69_adjustsetdamage(void); -void atk6A_removeitem(void); -static void atk6B_atknameinbuff1(void); -static void atk6C_drawlvlupbox(void); -static void atk6D_resetsentmonsvalue(void); -static void atk6E_setatktoplayer0(void); -static void atk6F_makevisible(void); -static void atk70_recordlastability(void); -static void atk71_buffermovetolearn(void); -static void atk72_jumpifplayerran(void); -static void atk73_hpthresholds(void); -static void atk74_hpthresholds2(void); -static void atk75_useitemonopponent(void); -static void atk76_various(void); -static void atk77_setprotectlike(void); -static void atk78_faintifabilitynotdamp(void); -static void atk79_setatkhptozero(void); -static void atk7A_jumpifnexttargetvalid(void); -static void atk7B_tryhealhalfhealth(void); -static void atk7C_trymirrormove(void); -static void atk7D_setrain(void); -static void atk7E_setreflect(void); -static void atk7F_setseeded(void); -static void atk80_manipulatedamage(void); -static void atk81_trysetrest(void); -static void atk82_jumpifnotfirstturn(void); -static void atk83_nop(void); -static void atk84_jumpifcantmakeasleep(void); -static void atk85_stockpile(void); -static void atk86_stockpiletobasedamage(void); -static void atk87_stockpiletohpheal(void); -static void atk88_negativedamage(void); -static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr); -static void atk89_statbuffchange(void); -static void atk8A_normalisebuffs(void); -static void atk8B_setbide(void); -static void atk8C_confuseifrepeatingattackends(void); -static void atk8D_setmultihitcounter(void); -static void atk8E_initmultihitstring(void); -static void atk8F_forcerandomswitch(void); -static void atk90_tryconversiontypechange(void); -static void atk91_givepaydaymoney(void); -static void atk92_setlightscreen(void); -static void atk93_tryKO(void); -static void atk94_damagetohalftargethp(void); -static void atk95_setsandstorm(void); -static void atk96_weatherdamage(void); -static void atk97_tryinfatuating(void); -static void atk98_updatestatusicon(void); -static void atk99_setmist(void); -static void atk9A_setfocusenergy(void); -static void atk9B_transformdataexecution(void); -static void atk9C_setsubstitute(void); -static void atk9D_mimicattackcopy(void); -static void atk9E_metronome(void); -static void atk9F_dmgtolevel(void); -static void atkA0_psywavedamageeffect(void); -static void atkA1_counterdamagecalculator(void); -static void atkA2_mirrorcoatdamagecalculator(void); -static void atkA3_disablelastusedattack(void); -static void atkA4_trysetencore(void); -static void atkA5_painsplitdmgcalc(void); -static void atkA6_settypetorandomresistance(void); -static void atkA7_setalwayshitflag(void); -static void atkA8_copymovepermanently(void); -static void atkA9_trychoosesleeptalkmove(void); -static void atkAA_setdestinybond(void); -static void atkAB_trysetdestinybondtohappen(void); -static void atkAC_remaininghptopower(void); -static void atkAD_tryspiteppreduce(void); -static void atkAE_healpartystatus(void); -static void atkAF_cursetarget(void); -static void atkB0_trysetspikes(void); -static void atkB1_setforesight(void); -static void atkB2_trysetperishsong(void); -static void atkB3_rolloutdamagecalculation(void); -static void atkB4_jumpifconfusedandstatmaxed(void); -static void atkB5_furycuttercalc(void); -static void atkB6_happinesstodamagecalculation(void); -static void atkB7_presentdamagecalculation(void); -static void atkB8_setsafeguard(void); -static void atkB9_magnitudedamagecalculation(void); -static void atkBA_jumpifnopursuitswitchdmg(void); -static void atkBB_setsunny(void); -static void atkBC_maxattackhalvehp(void); -static void atkBD_copyfoestats(void); -static void atkBE_rapidspinfree(void); -static void atkBF_setdefensecurlbit(void); -static void atkC0_recoverbasedonsunlight(void); -static void atkC1_hiddenpowercalc(void); -static void atkC2_selectfirstvalidtarget(void); -static void atkC3_trysetfutureattack(void); -static void atkC4_trydobeatup(void); -static void atkC5_setsemiinvulnerablebit(void); -static void atkC6_clearsemiinvulnerablebit(void); -static void atkC7_setminimize(void); -static void atkC8_sethail(void); -static void atkC9_jumpifattackandspecialattackcannotfall(void); -static void atkCA_setforcedtarget(void); -static void atkCB_setcharge(void); -static void atkCC_callterrainattack(void); -static void atkCD_cureifburnedparalysedorpoisoned(void); -static void atkCE_settorment(void); -static void atkCF_jumpifnodamage(void); -static void atkD0_settaunt(void); -static void atkD1_trysethelpinghand(void); -static void atkD2_tryswapitems(void); -static void atkD3_trycopyability(void); -static void atkD4_trywish(void); -static void atkD5_trysetroots(void); -static void atkD6_doubledamagedealtifdamaged(void); -static void atkD7_setyawn(void); -static void atkD8_setdamagetohealthdifference(void); -static void atkD9_scaledamagebyhealthratio(void); -static void atkDA_tryswapabilities(void); -static void atkDB_tryimprision(void); -static void atkDC_trysetgrudge(void); -static void atkDD_weightdamagecalculation(void); -static void atkDE_asistattackselect(void); -static void atkDF_trysetmagiccoat(void); -static void atkE0_trysetsnatch(void); -static void atkE1_trygetintimidatetarget(void); -static void atkE2_switchoutabilities(void); -static void atkE3_jumpifhasnohp(void); -static void atkE4_getsecretpowereffect(void); -static void atkE5_pickup(void); -static void atkE6_docastformchangeanimation(void); -static void atkE7_trycastformdatachange(void); -static void atkE8_settypebasedhalvers(void); -static void atkE9_setweatherballtype(void); -static void atkEA_tryrecycleitem(void); -static void atkEB_settypetoterrain(void); -static void atkEC_pursuitrelated(void); -static void atkED_snatchsetbanks(void); -static void atkEE_removelightscreenreflect(void); -void atkEF_handleballthrow(void); -static void atkF0_givecaughtmon(void); -static void atkF1_trysetcaughtmondexflags(void); -static void atkF2_displaydexinfo(void); -static void atkF3_trygivecaughtmonnick(void); -static void atkF4_subattackerhpbydmg(void); -static void atkF5_removeattackerstatus1(void); -static void atkF6_finishaction(void); -static void atkF7_finishturn(void); - -void (* const gBattleScriptingCommandsTable[])(void) = -{ - atk00_attackcanceler, - atk01_accuracycheck, - atk02_attackstring, - atk03_ppreduce, - atk04_critcalc, - atk05_damagecalc, - atk06_typecalc, - atk07_adjustnormaldamage, - atk08_adjustnormaldamage2, - atk09_attackanimation, - atk0A_waitanimation, - atk0B_healthbarupdate, - atk0C_datahpupdate, - atk0D_critmessage, - atk0E_effectivenesssound, - atk0F_resultmessage, - atk10_printstring, - atk11_printselectionstring, - atk12_waitmessage, - atk13_printfromtable, - atk14_printselectionstringfromtable, - atk15_seteffectwithchance, - atk16_seteffectprimary, - atk17_seteffectsecondary, - atk18_clearstatusfromeffect, - atk19_tryfaintmon, - atk1A_dofaintanimation, - atk1B_cleareffectsonfaint, - atk1C_jumpifstatus, - atk1D_jumpifstatus2, - atk1E_jumpifability, - atk1F_jumpifsideaffecting, - atk20_jumpifstat, - atk21_jumpifstatus3condition, - atk22_jumpiftype, - atk23_getexp, - atk24, - atk25_movevaluescleanup, - atk26_setmultihit, - atk27_decrementmultihit, - atk28_goto, - atk29_jumpifbyte, - atk2A_jumpifhalfword, - atk2B_jumpifword, - atk2C_jumpifarrayequal, - atk2D_jumpifarraynotequal, - atk2E_setbyte, - atk2F_addbyte, - atk30_subbyte, - atk31_copyarray, - atk32_copyarraywithindex, - atk33_orbyte, - atk34_orhalfword, - atk35_orword, - atk36_bicbyte, - atk37_bichalfword, - atk38_bicword, - atk39_pause, - atk3A_waitstate, - atk3B_healthbar_update, - atk3C_return, - atk3D_end, - atk3E_end2, - atk3F_end3, - atk40_jumpifaffectedbyprotect, - atk41_call, - atk42_jumpiftype2, - atk43_jumpifabilitypresent, - atk44_endselectionscript, - atk45_playanimation, - atk46_playanimation2, - atk47_setgraphicalstatchangevalues, - atk48_playstatchangeanimation, - atk49_moveend, - atk4A_typecalc2, - atk4B_returnatktoball, - atk4C_getswitchedmondata, - atk4D_switchindataupdate, - atk4E_switchinanim, - atk4F_jumpifcantswitch, - atk50_openpartyscreen, - atk51_switchhandleorder, - atk52_switchineffects, - atk53_trainerslidein, - atk54_playse, - atk55_fanfare, - atk56_playfaintcry, - atk57, - atk58_returntoball, - atk59_handlelearnnewmove, - atk5A_yesnoboxlearnmove, - atk5B_yesnoboxstoplearningmove, - atk5C_hitanimation, - atk5D_getmoneyreward, - atk5E_8025A70, - atk5F_8025B24, - atk60_incrementgamestat, - atk61_drawpartystatussummary, - atk62_08025C6C, - atk63_jumptorandomattack, - atk64_statusanimation, - atk65_status2animation, - atk66_chosenstatusanimation, - atk67_yesnobox, - atk68_cancelallactions, - atk69_adjustsetdamage, - atk6A_removeitem, - atk6B_atknameinbuff1, - atk6C_drawlvlupbox, - atk6D_resetsentmonsvalue, - atk6E_setatktoplayer0, - atk6F_makevisible, - atk70_recordlastability, - atk71_buffermovetolearn, - atk72_jumpifplayerran, - atk73_hpthresholds, - atk74_hpthresholds2, - atk75_useitemonopponent, - atk76_various, - atk77_setprotectlike, - atk78_faintifabilitynotdamp, - atk79_setatkhptozero, - atk7A_jumpifnexttargetvalid, - atk7B_tryhealhalfhealth, - atk7C_trymirrormove, - atk7D_setrain, - atk7E_setreflect, - atk7F_setseeded, - atk80_manipulatedamage, - atk81_trysetrest, - atk82_jumpifnotfirstturn, - atk83_nop, - atk84_jumpifcantmakeasleep, - atk85_stockpile, - atk86_stockpiletobasedamage, - atk87_stockpiletohpheal, - atk88_negativedamage, - atk89_statbuffchange, - atk8A_normalisebuffs, - atk8B_setbide, - atk8C_confuseifrepeatingattackends, - atk8D_setmultihitcounter, - atk8E_initmultihitstring, - atk8F_forcerandomswitch, - atk90_tryconversiontypechange, - atk91_givepaydaymoney, - atk92_setlightscreen, - atk93_tryKO, - atk94_damagetohalftargethp, - atk95_setsandstorm, - atk96_weatherdamage, - atk97_tryinfatuating, - atk98_updatestatusicon, - atk99_setmist, - atk9A_setfocusenergy, - atk9B_transformdataexecution, - atk9C_setsubstitute, - atk9D_mimicattackcopy, - atk9E_metronome, - atk9F_dmgtolevel, - atkA0_psywavedamageeffect, - atkA1_counterdamagecalculator, - atkA2_mirrorcoatdamagecalculator, - atkA3_disablelastusedattack, - atkA4_trysetencore, - atkA5_painsplitdmgcalc, - atkA6_settypetorandomresistance, - atkA7_setalwayshitflag, - atkA8_copymovepermanently, - atkA9_trychoosesleeptalkmove, - atkAA_setdestinybond, - atkAB_trysetdestinybondtohappen, - atkAC_remaininghptopower, - atkAD_tryspiteppreduce, - atkAE_healpartystatus, - atkAF_cursetarget, - atkB0_trysetspikes, - atkB1_setforesight, - atkB2_trysetperishsong, - atkB3_rolloutdamagecalculation, - atkB4_jumpifconfusedandstatmaxed, - atkB5_furycuttercalc, - atkB6_happinesstodamagecalculation, - atkB7_presentdamagecalculation, - atkB8_setsafeguard, - atkB9_magnitudedamagecalculation, - atkBA_jumpifnopursuitswitchdmg, - atkBB_setsunny, - atkBC_maxattackhalvehp, - atkBD_copyfoestats, - atkBE_rapidspinfree, - atkBF_setdefensecurlbit, - atkC0_recoverbasedonsunlight, - atkC1_hiddenpowercalc, - atkC2_selectfirstvalidtarget, - atkC3_trysetfutureattack, - atkC4_trydobeatup, - atkC5_setsemiinvulnerablebit, - atkC6_clearsemiinvulnerablebit, - atkC7_setminimize, - atkC8_sethail, - atkC9_jumpifattackandspecialattackcannotfall, - atkCA_setforcedtarget, - atkCB_setcharge, - atkCC_callterrainattack, - atkCD_cureifburnedparalysedorpoisoned, - atkCE_settorment, - atkCF_jumpifnodamage, - atkD0_settaunt, - atkD1_trysethelpinghand, - atkD2_tryswapitems, - atkD3_trycopyability, - atkD4_trywish, - atkD5_trysetroots, - atkD6_doubledamagedealtifdamaged, - atkD7_setyawn, - atkD8_setdamagetohealthdifference, - atkD9_scaledamagebyhealthratio, - atkDA_tryswapabilities, - atkDB_tryimprision, - atkDC_trysetgrudge, - atkDD_weightdamagecalculation, - atkDE_asistattackselect, - atkDF_trysetmagiccoat, - atkE0_trysetsnatch, - atkE1_trygetintimidatetarget, - atkE2_switchoutabilities, - atkE3_jumpifhasnohp, - atkE4_getsecretpowereffect, - atkE5_pickup, - atkE6_docastformchangeanimation, - atkE7_trycastformdatachange, - atkE8_settypebasedhalvers, - atkE9_setweatherballtype, - atkEA_tryrecycleitem, - atkEB_settypetoterrain, - atkEC_pursuitrelated, - atkED_snatchsetbanks, - atkEE_removelightscreenreflect, - atkEF_handleballthrow, - atkF0_givecaughtmon, - atkF1_trysetcaughtmondexflags, - atkF2_displaydexinfo, - atkF3_trygivecaughtmonnick, - atkF4_subattackerhpbydmg, - atkF5_removeattackerstatus1, - atkF6_finishaction, - atkF7_finishturn, -}; - -struct StatFractions -{ - u8 dividend; - u8 divisor; -}; - -static const struct StatFractions gAccuracyStageRatios[] = -{ - { 33, 100}, // -6 - { 36, 100}, // -5 - { 43, 100}, // -4 - { 50, 100}, // -3 - { 60, 100}, // -2 - { 75, 100}, // -1 - { 1, 1}, // 0 - {133, 100}, // +1 - {166, 100}, // +2 - { 2, 1}, // +3 - {233, 100}, // +4 - {133, 50}, // +5 - { 3, 1}, // +6 -}; - -// The chance is 1/N for each stage. -static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2}; - -static const u32 sStatusFlagsForMoveEffects[] = -{ - 0x00000000, - STATUS_SLEEP, - STATUS_POISON, - STATUS_BURN, - STATUS_FREEZE, - STATUS_PARALYSIS, - STATUS_TOXIC_POISON, - STATUS2_CONFUSION, - STATUS2_FLINCHED, - 0x00000000, - STATUS2_UPROAR, - 0x00000000, - STATUS2_MULTIPLETURNS, - STATUS2_WRAPPED, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - STATUS2_RECHARGE, - 0x00000000, - 0x00000000, - STATUS2_ESCAPE_PREVENTION, - STATUS2_NIGHTMARE, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - STATUS2_LOCK_CONFUSE, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000 -}; - -u8* const gMoveEffectBS_Ptrs[] = -{ - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectPoison, - BattleScript_MoveEffectBurn, - BattleScript_MoveEffectFreeze, - BattleScript_MoveEffectParalysis, - BattleScript_MoveEffectToxic, - BattleScript_MoveEffectConfusion, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectUproar, - BattleScript_MoveEffectPayDay, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectWrap, - BattleScript_MoveEffectRecoil33, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectSleep, - BattleScript_MoveEffectRecoil33 -}; - -const u8 sUnreferencedBitMask1[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F}; - -const u8 gLevelUpStatBoxStats[] = -{ - MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, - MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED -}; - -static const u16 sProtectSuccessRates[] = {0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF}; - -#define MIMIC_FORBIDDEN_END 0xFFFE -#define METRONOME_FORBIDDEN_END 0xFFFF -#define ASSIST_FORBIDDEN_END 0xFFFF - -static const u16 sMovesForbiddenToCopy[] = -{ - MOVE_METRONOME, - MOVE_STRUGGLE, - MOVE_SKETCH, - MOVE_MIMIC, - MIMIC_FORBIDDEN_END, - MOVE_COUNTER, - MOVE_MIRROR_COAT, - MOVE_PROTECT, - MOVE_DETECT, - MOVE_ENDURE, - MOVE_DESTINY_BOND, - MOVE_SLEEP_TALK, - MOVE_THIEF, - MOVE_FOLLOW_ME, - MOVE_SNATCH, - MOVE_HELPING_HAND, - MOVE_COVET, - MOVE_TRICK, - MOVE_FOCUS_PUNCH, - METRONOME_FORBIDDEN_END -}; - -static const u8 sFlailHpScaleToPowerTable[] = //reversal+flail HP thresholds to power -{ - 1, 200, - 4, 150, - 9, 100, - 16, 80, - 32, 40, - 48, 20 -}; - -static const u16 sNaturePowerMoves[] = -{ - MOVE_STUN_SPORE, - MOVE_RAZOR_LEAF, - MOVE_EARTHQUAKE, - MOVE_HYDRO_PUMP, - MOVE_SURF, - MOVE_BUBBLE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SHADOW_BALL, - MOVE_SWIFT, - MOVE_SWIFT -}; - -// weight-based damage table for Low Kick -// format: min. weight (hectograms), base power -static const u16 sWeightToDamageTable[] = -{ - 100, 20, - 250, 40, - 500, 60, - 1000, 80, - 2000, 100, - 0xFFFF, 0xFFFF -}; - -static const u16 sPickupItems[] = -{ - ITEM_SUPER_POTION, 30, - ITEM_FULL_HEAL, 40, - ITEM_ULTRA_BALL, 50, - ITEM_RARE_CANDY, 60, - ITEM_FULL_RESTORE, 70, - ITEM_REVIVE, 80, - ITEM_NUGGET, 90, - ITEM_PROTEIN, 95, - ITEM_PP_UP, 99, - ITEM_KINGS_ROCK, 1 -}; - -static const u8 sTerrainToType[] = -{ - TYPE_GRASS, // tall grass - TYPE_GRASS, // long grass - TYPE_GROUND, // sand - TYPE_WATER, // underwater - TYPE_WATER, // water - TYPE_WATER, // pond water - TYPE_ROCK, // rock - TYPE_ROCK, // cave - TYPE_NORMAL, // building - TYPE_NORMAL, // plain -}; - -static const u8 sBallCatchBonuses[] = -{ - 20, 15, 10, 15 // Ultra, Great, Poke, Safari -}; - -static void atk00_attackcanceler(void) -{ - s32 i; - - if (gBattleOutcome != 0) - { - gCurrentActionFuncId = ACTION_FINISHED; - return; - } - if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) - { - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gBattlescriptCurrInstr = BattleScript_MoveEnd; - return; - } - if (AtkCanceller_UnableToUseMove()) - return; - if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBankTarget, 0, 0, 0)) - return; - if (!gBattleMons[gBankAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200) - && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - gBattlescriptCurrInstr = BattleScript_NoPPForMove; - gMoveResultFlags |= MOVE_RESULT_MISSED; - return; - } - - gHitMarker &= ~(HITMARKER_x800000); - - if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - i = IsMonDisobedient(); // why use the 'i' variable...? - switch (i) - { - case 0: - break; - case 2: - gHitMarker |= HITMARKER_OBEYS; - return; - default: - gMoveResultFlags |= MOVE_RESULT_MISSED; - return; - } - } - - gHitMarker |= HITMARKER_OBEYS; - - if (gProtectStructs[gBankTarget].bounceMove && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_MAGIC_COAT) - { - PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT); - gProtectStructs[gBankTarget].bounceMove = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; - return; - } - - for (i = 0; i < gBattlersCount; i++) - { - if ((gProtectStructs[gBanksByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & F_AFFECTED_BY_SNATCH) - { - PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH); - gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0; - gBattleStruct->scriptingActive = gBanksByTurnOrder[i]; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SnatchedMove; - return; - } - } - - if (gSpecialStatuses[gBankTarget].lightningRodRedirected) - { - gSpecialStatuses[gBankTarget].lightningRodRedirected = 0; - gLastUsedAbility = ABILITY_LIGHTNING_ROD; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TookAttack; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else if (TARGET_PROTECT_AFFECTED - && (gCurrentMove != MOVE_CURSE || (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)) - && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)))) - { - CancelMultiTurnMoves(gBankAttacker); - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBankTarget] = 0; - gLastHitByType[gBankTarget] = 0; - gBattleCommunication[6] = 1; - gBattlescriptCurrInstr++; - } - else - { - gBattlescriptCurrInstr++; - } -} - -static void JumpIfMoveFailed(u8 adder, u16 move) -{ - const u8 *BS_ptr = gBattlescriptCurrInstr + adder; - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - { - gLastLandedMoves[gBankTarget] = 0; - gLastHitByType[gBankTarget] = 0; - BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - TrySetDestinyBondToHappen(); - if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBankTarget, 0, 0, move)) - return; - } - gBattlescriptCurrInstr = BS_ptr; -} - -static void atk40_jumpifaffectedbyprotect(void) -{ - if (TARGET_PROTECT_AFFECTED) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(5, 0); - gBattleCommunication[6] = 1; - } - else - { - gBattlescriptCurrInstr += 5; - } -} - -static bool8 JumpIfMoveAffectedByProtect(u16 move) -{ - bool8 affected = FALSE; - if (TARGET_PROTECT_AFFECTED) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - gBattleCommunication[6] = 1; - affected = TRUE; - } - return affected; -} - -static bool8 AccuracyCalcHelper(u16 move) -{ - if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) - { - JumpIfMoveFailed(7, move); - return TRUE; - } - - if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBankTarget] & STATUS3_ON_AIR) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - gHitMarker &= ~HITMARKER_IGNORE_ON_AIR; - - if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBankTarget] & STATUS3_UNDERGROUND) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND; - - if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBankTarget] & STATUS3_UNDERWATER) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; - - if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER) - || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) - { - JumpIfMoveFailed(7, move); - return TRUE; - } - - return FALSE; -} - -static void atk01_accuracycheck(void) -{ - u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); - - if (move == 0xFFFE || move == 0xFFFF) - { - if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) - gBattlescriptCurrInstr += 7; - else if (gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else if (!JumpIfMoveAffectedByProtect(0)) - gBattlescriptCurrInstr += 7; - } - else - { - u8 type, moveAcc, holdEffect, quality; - s8 buff; - u16 calc; - - if (move == 0) - move = gCurrentMove; - - GET_MOVE_TYPE(move, type); - - if (JumpIfMoveAffectedByProtect(move)) - return; - if (AccuracyCalcHelper(move)) - return; - - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - { - u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC]; - buff = acc; - } - else - { - u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC]; - buff = acc + 6 - gBattleMons[gBankTarget].statStages[STAT_STAGE_EVASION]; - } - - if (buff < 0) - buff = 0; - if (buff > 0xC) - buff = 0xC; - - moveAcc = gBattleMoves[move].accuracy; - // check Thunder on sunny weather - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) - moveAcc = 50; - - calc = gAccuracyStageRatios[buff].dividend * moveAcc; - calc /= gAccuracyStageRatios[buff].divisor; - - if (gBattleMons[gBankAttacker].ability == ABILITY_COMPOUND_EYES) - calc = (calc * 130) / 100; // 1.3 compound eyes boost - if (WEATHER_HAS_EFFECT && gBattleMons[gBankTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY) - calc = (calc * 80) / 100; // 1.2 sand veil loss; - if (gBattleMons[gBankAttacker].ability == ABILITY_HUSTLE && type < 9) - calc = (calc * 80) / 100; // 1.2 hustle loss; - - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[gBankTarget].holdEffect; - quality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (holdEffect == HOLD_EFFECT_EVASION_UP) - calc = (calc * (100 - quality)) / 100; - - // final calculation - if ((Random() % 100 + 1) > calc) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && - (gBattleMoves[move].target == 0x8 || gBattleMoves[move].target == 0x20)) - gBattleCommunication[6] = 2; - else - gBattleCommunication[6] = 0; - CheckWonderGuardAndLevitate(); - } - JumpIfMoveFailed(7, move); - } -} - -static void atk02_attackstring(void) -{ - if (gBattleExecBuffer) - return; - if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) - { - PrepareStringBattle(4, gBankAttacker); - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; - } - gBattlescriptCurrInstr++; - gBattleCommunication[MSG_DISPLAY] = 0; -} - -static void atk03_ppreduce(void) -{ - s32 ppToDeduct = 1; - - if (gBattleExecBuffer) - return; - - if (!gSpecialStatuses[gBankAttacker].flag20) - { - switch (gBattleMoves[gCurrentMove].target) - { - case TARGET_FOES_AND_ALLY: - ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBankAttacker, ABILITY_PRESSURE, 0, 0); - break; - case TARGET_BOTH: - case TARGET_OPPONENTS_FIELD: - ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_PRESSURE, 0, 0); - break; - default: - if (gBankAttacker != gBankTarget && gBattleMons[gBankTarget].ability == ABILITY_PRESSURE) - ppToDeduct++; - break; - } - } - - if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBankAttacker].pp[gCurrMovePos]) - { - gProtectStructs[gBankAttacker].notFirstStrike = 1; - - if (gBattleMons[gBankAttacker].pp[gCurrMovePos] > ppToDeduct) - gBattleMons[gBankAttacker].pp[gCurrMovePos] -= ppToDeduct; - else - gBattleMons[gBankAttacker].pp[gCurrMovePos] = 0; - - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) - && !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos])) - { - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]); - MarkBufferBankForExecution(gBankAttacker); - } - } - - gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); - gBattlescriptCurrInstr++; -} - -static void atk04_critcalc(void) -{ - u8 holdEffect; - u16 item, critChance; - - item = gBattleMons[gBankAttacker].item; - - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[gBankAttacker].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(item); - - gStringBank = gBankAttacker; - - critChance = 2 * ((gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0) - + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) - + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) - + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK) - + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL) - + (holdEffect == HOLD_EFFECT_SCOPE_LENS) - + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY) - + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD); - - if (critChance > 4) - critChance = 4; - - if ((gBattleMons[gBankTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBankTarget].ability != ABILITY_SHELL_ARMOR) - && !(gStatuses3[gBankAttacker] & STATUS3_CANT_SCORE_A_CRIT) - && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) - && !(Random() % sCriticalHitChance[critChance])) - gCritMultiplier = 2; - else - gCritMultiplier = 1; - - gBattlescriptCurrInstr++; -} - -static void atk05_damagecalc(void) -{ - u16 side_hword = gSideAffecting[GetBattlerPosition(gBankTarget) & 1]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - side_hword, gDynamicBasePower, - gBattleStruct->dynamicMoveType, gBankAttacker, gBankTarget); - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleStruct->dmgMultiplier; - - if (gStatuses3[gBankAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - gBattlescriptCurrInstr++; -} - -void AI_CalcDmg(u8 BankAtk, u8 BankDef) -{ - u16 side_hword = gSideAffecting[GetBattlerPosition(BankDef) & 1]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[BankAtk], &gBattleMons[BankDef], gCurrentMove, - side_hword, gDynamicBasePower, - gBattleStruct->dynamicMoveType, BankAtk, BankDef); - gDynamicBasePower = 0; - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleStruct->dmgMultiplier; - - if (gStatuses3[BankAtk] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[BankAtk].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; -} - -static void ModulateDmgByType(u8 multiplier) -{ - gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier != 0) - gBattleMoveDamage = 1; - - switch (multiplier) - { - case 0: //no effect - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - break; - case 5: //not very effecting - if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) - gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - else - gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - break; - case 20: //super effective - if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - else - gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - break; - } -} - -static void atk06_typecalc(void) -{ - int i = 0; - u8 move_type; - if (gCurrentMove != MOVE_STRUGGLE) - { - if (gBattleStruct->dynamicMoveType) - move_type = gBattleStruct->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - //check stab - if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) - { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - gLastLandedMoves[gBankTarget] = 0; - gLastHitByType[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - else if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - } - i += 3; - } - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 - && (!(gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || ((gMoveResultFlags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBankTarget] = 0; - gLastHitByType[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - gProtectStructs[gBankAttacker].notEffective = 1; - } - gBattlescriptCurrInstr++; -} -static void CheckWonderGuardAndLevitate(void) -{ - u8 flags = 0; - int i = 0; - u8 move_type; - - if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power) - return; - - if (gBattleStruct->dynamicMoveType) - move_type = gBattleStruct->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - RecordAbilitySetField6(ABILITY_LEVITATE, move_type); - return; - } - - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - if (gTypeEffectiveness[i] == move_type) - { - //check no effect - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 0) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gProtectStructs[gBankAttacker].notEffective = 1; - } - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && - gTypeEffectiveness[i + 2] == 0) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gProtectStructs[gBankAttacker].notEffective = 1; - } - - //check super effective - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 20) - flags |= 1; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 20) - flags |= 1; - - //check not very effective - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 5) - flags |= 2; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 5) - flags |= 2; - } - i += 3; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2) - { - if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power) - { - RecordAbilitySetField6(ABILITY_WONDER_GUARD, 3); - } - } -} - -static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) //a literal copy of the ModulateDmgbyType1 with different args... -{ - gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier != 0) - gBattleMoveDamage = 1; - - switch (multiplier) - { - case 0: //no effect - *flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - break; - case 5: //not very effecting - if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT)) - { - if (*flags & MOVE_RESULT_SUPER_EFFECTIVE) - *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - else - *flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - break; - case 20: //super effective - if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT)) - { - if (*flags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - else - *flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - break; - } -} - -u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) -{ - int i = 0; - u8 flags = 0; - u8 move_type; - - if (move == MOVE_STRUGGLE) - return 0; - - move_type = gBattleMoves[move].type; - - //check stab - if (gBattleMons[bank_atk].type1 == move_type || gBattleMons[bank_atk].type2 == move_type) - { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } - - if (gBattleMons[bank_def].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - flags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[bank_def].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - else if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type1) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type2 && - gBattleMons[gBankTarget /* what the christ */].type1 != gBattleMons[bank_def].type2) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - } - i += 3; - } - } - - if (gBattleMons[bank_def].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_MISSED) && - AttacksThisTurn(bank_atk, move) == 2 && - (!(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[move].power) - { - flags |= MOVE_RESULT_MISSED; - } - return flags; -} - -u8 AI_TypeCalc(u16 move, u16 species, u8 ability) -{ - int i = 0; - u8 flags = 0; - u8 type1 = gBaseStats[species].type1, type2 = gBaseStats[species].type2, move_type; - - if (move == MOVE_STRUGGLE) - return 0; - - move_type = gBattleMoves[move].type; - - if (ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE; - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - i += 3; - continue; - } - if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == type1) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - //check type2 - if (gTypeEffectiveness[i + 1] == type2 && gBattleMons[gBankTarget].type1 != type2) //gf you morons, you should check if (type1 != type2)... - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - } - i += 3; - } - } - if (ability == ABILITY_WONDER_GUARD - && (!(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[move].power) - flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - return flags; -} - -// Multiplies the damage by a random factor between 85% to 100% inclusive -static inline void ApplyRandomDmgMultiplier(void) -{ - u16 rand = Random(); - u16 randPercent = 100 - (rand % 16); - - if (gBattleMoveDamage != 0) - { - gBattleMoveDamage *= randPercent; - gBattleMoveDamage /= 100; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } -} - -void Unused_ApplyRandomDmgMultiplier(void) -{ - ApplyRandomDmgMultiplier(); -} - -static void atk07_adjustnormaldamage(void) -{ - u8 hold_effect, quality; - ApplyRandomDmgMultiplier(); - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - { - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -static void atk08_adjustnormaldamage2(void) //literally the same as 0x7 except it doesn't check for false swipe move effect... -{ - u8 hold_effect, quality; - ApplyRandomDmgMultiplier(); - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - { - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (!gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -static void atk09_attackanimation(void) -{ - if (gBattleExecBuffer) - return; - - if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_Pausex20; - gBattleStruct->animTurn += 1; - gBattleStruct->animTargetsHit += 1; - } - else - { - if ((gBattleMoves[gCurrentMove].target & TARGET_BOTH || gBattleMoves[gCurrentMove].target & TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & TARGET_DEPENDS) && gBattleStruct->animTargetsHit) - { - gBattlescriptCurrInstr++; - return; - } - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gActiveBattler = gBankAttacker; - - EmitMoveAnimation(0, gCurrentMove, gBattleStruct->animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBankAttacker].friendship, &gDisableStructs[gBankAttacker]); - gBattleStruct->animTurn += 1; - gBattleStruct->animTargetsHit += 1; - MarkBufferBankForExecution(gBankAttacker); - gBattlescriptCurrInstr++; - } - else - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_Pausex20; - } - } -} - -static void atk0A_waitanimation(void) -{ - if (gBattleExecBuffer == 0) - gBattlescriptCurrInstr++; -} - -static void atk0B_healthbarupdate(void) -{ - if (gBattleExecBuffer) - return; - - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { - PrepareStringBattle(0x80, gActiveBattler); - } - else - { - // Emerald - /* - s16 healthValue; - - s32 currDmg = gBattleMoveDamage; - s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign - - if (currDmg <= maxPossibleDmgValue) - healthValue = currDmg; - else - healthValue = maxPossibleDmgValue; - - EmitHealthBarUpdate(0, healthValue); - */ - - EmitHealthBarUpdate(0, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBattler); - - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) - gBattleResults.unk5_0 = 1; - } - } - - gBattlescriptCurrInstr += 2; -} - -static void atk0C_datahpupdate(void) -{ - u32 moveType; - - if (gBattleExecBuffer) - return; - - if (gBattleStruct->dynamicMoveType == 0) - moveType = gBattleMoves[gCurrentMove].type; - else if (!(gBattleStruct->dynamicMoveType & 0x40)) - moveType = gBattleStruct->dynamicMoveType & 0x3F; - else - moveType = gBattleMoves[gCurrentMove].type; - - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { - if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage) - { - if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0) - gSpecialStatuses[gActiveBattler].moveturnLostHP = gBattleMoveDamage; - gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage; - gHpDealt = gBattleMoveDamage; - } - else - { - if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0) - gSpecialStatuses[gActiveBattler].moveturnLostHP = gDisableStructs[gActiveBattler].substituteHP; - gHpDealt = gDisableStructs[gActiveBattler].substituteHP; - gDisableStructs[gActiveBattler].substituteHP = 0; - } - // check substitute fading - if (gDisableStructs[gActiveBattler].substituteHP == 0) - { - gBattlescriptCurrInstr += 2; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SubstituteFade; - return; - } - } - else - { - gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE); - if (gBattleMoveDamage < 0) // hp goes up - { - gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; - if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP) - gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP; - - } - else // hp goes down - { - if (gHitMarker & HITMARKER_x20) - { - gHitMarker &= ~(HITMARKER_x20); - } - else - { - gTakenDmg[gActiveBattler] += gBattleMoveDamage; - if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) - gTakenDmgBanks[gActiveBattler] = gBankAttacker; - else - gTakenDmgBanks[gActiveBattler] = gBankTarget; - } - - if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage) - { - gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; - gHpDealt = gBattleMoveDamage; - } - else - { - gHpDealt = gBattleMons[gActiveBattler].hp; - gBattleMons[gActiveBattler].hp = 0; - } - - if (!gSpecialStatuses[gActiveBattler].moveturnLostHP && !(gHitMarker & HITMARKER_x100000)) - gSpecialStatuses[gActiveBattler].moveturnLostHP = gHpDealt; - - if (TYPE_IS_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) - { - gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; - gSpecialStatuses[gActiveBattler].moveturnLostHP_physical = gHpDealt; - if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) - { - gProtectStructs[gActiveBattler].physicalBank = gBankAttacker; - gSpecialStatuses[gActiveBattler].moveturnPhysicalBank = gBankAttacker; - } - else - { - gProtectStructs[gActiveBattler].physicalBank = gBankTarget; - gSpecialStatuses[gActiveBattler].moveturnPhysicalBank = gBankTarget; - } - } - else if (!TYPE_IS_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000)) - { - gProtectStructs[gActiveBattler].specialDmg = gHpDealt; - gSpecialStatuses[gActiveBattler].moveturnLostHP_special = gHpDealt; - if (gBattlescriptCurrInstr[1] == BS_GET_TARGET) - { - gProtectStructs[gActiveBattler].specialBank = gBankAttacker; - gSpecialStatuses[gActiveBattler].moveturnSpecialBank = gBankAttacker; - } - else - { - gProtectStructs[gActiveBattler].specialBank = gBankTarget; - gSpecialStatuses[gActiveBattler].moveturnSpecialBank = gBankTarget; - } - } - } - gHitMarker &= ~(HITMARKER_x100000); - EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp); - MarkBufferBankForExecution(gActiveBattler); - } - } - else - { - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - if (gSpecialStatuses[gActiveBattler].moveturnLostHP == 0) - gSpecialStatuses[gActiveBattler].moveturnLostHP = 0xFFFF; - } - gBattlescriptCurrInstr += 2; -} - -static void atk0D_critmessage(void) -{ - if (gBattleExecBuffer == 0) - { - if (gCritMultiplier == 2 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - PrepareStringBattle(0xD9, gBankAttacker); - gBattleCommunication[MSG_DISPLAY] = 1; - } - gBattlescriptCurrInstr++; - } -} - -static void atk0E_effectivenesssound(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBattler = gBankTarget; - if (!(gMoveResultFlags & MOVE_RESULT_MISSED)) - { - u8 flag = ~MOVE_RESULT_MISSED; - switch (gMoveResultFlags & flag) - { - case MOVE_RESULT_SUPER_EFFECTIVE: - EmitEffectivenessSound(0, 14); - MarkBufferBankForExecution(gActiveBattler); - break; - case MOVE_RESULT_NOT_VERY_EFFECTIVE: - EmitEffectivenessSound(0, 12); - MarkBufferBankForExecution(gActiveBattler); - break; - case MOVE_RESULT_DOESNT_AFFECT_FOE: - case MOVE_RESULT_FAILED: - break; - case MOVE_RESULT_FOE_ENDURED: - case MOVE_RESULT_ONE_HIT_KO: - case MOVE_RESULT_FOE_HUNG_ON: - default: - if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) - { - EmitEffectivenessSound(0, 14); - MarkBufferBankForExecution(gActiveBattler); - } - else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - { - EmitEffectivenessSound(0, 12); - MarkBufferBankForExecution(gActiveBattler); - } - else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) - { - EmitEffectivenessSound(0, 13); - MarkBufferBankForExecution(gActiveBattler); - } - break; - } - } - gBattlescriptCurrInstr++; -} - -static void atk0F_resultmessage(void) -{ - u32 stringId = 0; - - if (gBattleExecBuffer) - return; - - if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[6] > 2)) - { - stringId = gMissStringIds[gBattleCommunication[6]]; - gBattleCommunication[MSG_DISPLAY] = 1; - } - else - { - gBattleCommunication[MSG_DISPLAY] = 1; - switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED))) - { - case MOVE_RESULT_SUPER_EFFECTIVE: - stringId = STRINGID_SUPEREFFECTIVE; - break; - case MOVE_RESULT_NOT_VERY_EFFECTIVE: - stringId = STRINGID_NOTVERYEFFECTIVE; - break; - case MOVE_RESULT_ONE_HIT_KO: - stringId = STRINGID_ONEHITKO; - break; - case MOVE_RESULT_FOE_ENDURED: - stringId = STRINGID_PKMNENDUREDHIT; - break; - case MOVE_RESULT_FAILED: - stringId = STRINGID_BUTITFAILED; - break; - case MOVE_RESULT_DOESNT_AFFECT_FOE: - stringId = STRINGID_ITDOESNTAFFECT; - break; - case MOVE_RESULT_FOE_HUNG_ON: - gLastUsedItem = gBattleMons[gBankTarget].item; - gStringBank = gBankTarget; - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; - return; - default: - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - { - stringId = STRINGID_ITDOESNTAFFECT; - } - else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO) - { - gMoveResultFlags &= ~(MOVE_RESULT_ONE_HIT_KO); - gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE); - gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED) - { - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EnduredMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON) - { - gLastUsedItem = gBattleMons[gBankTarget].item; - gStringBank = gBankTarget; - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; - return; - } - else if (gMoveResultFlags & MOVE_RESULT_FAILED) - { - stringId = STRINGID_BUTITFAILED; - } - else - { - gBattleCommunication[MSG_DISPLAY] = 0; - } - } - } - - if (stringId) - PrepareStringBattle(stringId, gBankAttacker); - - gBattlescriptCurrInstr++; -} - -static void atk10_printstring(void) -{ - if (gBattleExecBuffer == 0) - { - u16 var = T2_READ_16(gBattlescriptCurrInstr + 1); - PrepareStringBattle(var, gBankAttacker); - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -static void atk11_printselectionstring(void) -{ - gActiveBattler = gBankAttacker; - EmitPrintStringPlayerOnly(0, T2_READ_16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 1; -} - -static void atk12_waitmessage(void) -{ - if (gBattleExecBuffer == 0) - { - if (!gBattleCommunication[MSG_DISPLAY]) - { - gBattlescriptCurrInstr += 3; - } - else - { - u16 to_wait = T2_READ_16(gBattlescriptCurrInstr + 1); - if (++gPauseCounterBattle >= to_wait) - { - gPauseCounterBattle = 0; - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 0; - } - } - } -} - -static void atk13_printfromtable(void) -{ - if (gBattleExecBuffer == 0) - { - u16 *ptr = (u16 *)T1_READ_PTR(gBattlescriptCurrInstr + 1); - ptr += gBattleCommunication[MULTISTRING_CHOOSER]; - PrepareStringBattle(*(u16*)ptr, gBankAttacker); - gBattlescriptCurrInstr += 5; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -static void atk14_printselectionstringfromtable(void) -{ - if (gBattleExecBuffer == 0) - { - u16 *ptr = (u16 *)T1_READ_PTR(gBattlescriptCurrInstr + 1); // FIXME - ptr += gBattleCommunication[MULTISTRING_CHOOSER]; - gActiveBattler = gBankAttacker; - EmitPrintStringPlayerOnly(0, *(u16*)ptr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 5; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -u8 BankGetTurnOrder(u8 bank) -{ - int i; - for (i = 0; i < gBattlersCount; i++) - { - if (gBanksByTurnOrder[i] == bank) - break; - } - return i; -} - -//Someone please decompile this monstrosity below... -#ifdef NONMATCHING -void SetMoveEffect(bool8 primary, u8 certainArg) -{ - #define EffectAffectsUser 0x40 - register u8 certain asm("r5") = certainArg; - register bool32 StatusChanged asm("r10") = 0; - register int AffectsUser asm("r6") = 0; //0x40 otherwise - bool32 NoSunCanFreeze = 1; - - if (gBattleCommunication[MOVE_EFFECT_BYTE] & EffectAffectsUser) - { - gEffectBank = gBankAttacker; //bank that effects get applied on - gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(EffectAffectsUser); - AffectsUser = EffectAffectsUser; - gBattleStruct->scriptingActive = gBankTarget; //theoretically the attacker - } - else - { - gEffectBank = gBankTarget; - gBattleStruct->scriptingActive = gBankAttacker; - } - - if (gBattleMons[gEffectBank].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && - !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) - {gBattlescriptCurrInstr++; return;} - - if (gSideAffecting[GetBattlerPosition(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && - !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) - {gBattlescriptCurrInstr++; return;} - - //make sure at least ONE HP except payday and thief - if (gBattleMons[gEffectBank].hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) - {gBattlescriptCurrInstr++; return;} - - if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && AffectsUser != EffectAffectsUser) - {gBattlescriptCurrInstr++; return;} - - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) //status change - { - switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - case STATUS_SLEEP: - //check active uproar - if (gBattleMons[gEffectBank].ability != ABILITY_SOUNDPROOF) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR); gActiveBattler++) {} - } - else - gActiveBattler = gBattlersCount; - if (gBattleMons[gEffectBank].status1) {break;} - if (gActiveBattler != gBattlersCount) {break;} //nice way of checking uproar... - if (gBattleMons[gEffectBank].ability == ABILITY_VITAL_SPIRIT) {break;} - if (gBattleMons[gEffectBank].ability == ABILITY_INSOMNIA) {break;} - - CancelMultiTurnMoves(gEffectBank); - StatusChanged = 1; - break; - case STATUS_POISON: - if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); - BattleScriptPush(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - return; - } - if (gBattleMons[gEffectBank].type1 == TYPE_POISON) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_POISON) {break;} - if (gBattleMons[gEffectBank].type1 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].status1) {break;} - if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} - - StatusChanged = 1; - break; - case STATUS_BURN: - if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_WATER_VEIL; - RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL); - BattleScriptPush(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BattleScript_BRNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_BRNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - return; - } - if (gBattleMons[gEffectBank].type1 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL) {break;} - if (gBattleMons[gEffectBank].status1 == 0) {break;} - StatusChanged = 1; - break; - case STATUS_FREEZE: - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) {NoSunCanFreeze = 0;} - if (gBattleMons[gEffectBank].type1 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].status1) {break;} - if (NoSunCanFreeze == 0) {break;} - if (gBattleMons[gEffectBank].ability == ABILITY_MAGMA_ARMOR) {break;} - - CancelMultiTurnMoves(gEffectBank); - StatusChanged = 1; - break; - case STATUS_PARALYSIS: - if (gBattleMons[gEffectBank].ability == ABILITY_LIMBER) - { - if ((primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_LIMBER; - RecordAbilityBattle(gEffectBank, ABILITY_LIMBER); - BattleScriptPush(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BattleScript_PRLZPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} - } - else {break;} - } - if (gBattleMons[gEffectBank].status1) {break;} - StatusChanged = 1; - break; - case STATUS_TOXIC_POISON: - if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); - BattleScriptPush(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_PSNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - return; - } - if (gBattleMons[gEffectBank].status1) {break;} - if (gBattleMons[gEffectBank].type1 != TYPE_POISON && - gBattleMons[gEffectBank].type2 != TYPE_POISON && - gBattleMons[gEffectBank].type1 != TYPE_STEEL && - gBattleMons[gEffectBank].type2 != TYPE_STEEL) - { - if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} - gBattleMons[gEffectBank].status1 &= ~(0x9); //This gets (correctly) optimized out... - StatusChanged = 1; - break; - } - else - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (StatusChanged == 1) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP) - gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); - else - gBattleMons[gEffectBank].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gActiveBattler = gEffectBank; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); - MarkBufferBankForExecution(gActiveBattler); - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - } - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3) - { - gBattleStruct->synchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; - gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; - } - return; - } - else if (StatusChanged == 0) - {gBattlescriptCurrInstr++; return;} - } - else - { - if (gBattleMons[gEffectBank].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - gBattlescriptCurrInstr++; - return; - } - switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - case 7: //confusion - if (gBattleMons[gEffectBank].ability == ABILITY_OWN_TEMPO) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 8: //flinch - if (gBattleMons[gEffectBank].ability == ABILITY_INNER_FOCUS) - { - if (primary == 1 || certain == 0x80) - { - gLastUsedAbility = ABILITY_INNER_FOCUS; - RecordAbilityBattle(gEffectBank, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BattleScript_FlinchPrevention; - return; - } - else - {gBattlescriptCurrInstr++; return;} - } - else - { - if (BankGetTurnOrder(gEffectBank) > gCurrentTurnActionNumber) - gBattleMons[gEffectBank].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr++; return; - } - break; - case 10: //uproar - if (gBattleMons[gEffectBank].status2 & STATUS2_UPROAR) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBank] = gCurrentMove; - gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 11: //pay day - if (!(GetBattlerPosition(gBankAttacker) & 1)) - { - u16 PayDay = gPaydayMoney; - gPaydayMoney += (gBattleMons[gBankAttacker].level * 5); - if (PayDay > gPaydayMoney) - gPaydayMoney = 0xFFFF; - } - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 9: //tri attack - if (gBattleMons[gEffectBank].status1) - {gBattlescriptCurrInstr++; return;} - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; - SetMoveEffect(0, 0); - break; - case 12: //charging move - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBank] = gCurrentMove; - gProtectStructs[gEffectBank].chargingTurn = 1; - gBattlescriptCurrInstr++; - break; - case 13: //wrap - if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD; - gBattleStruct->wrappedMove[gEffectBank*2] = (u8)gCurrentMove; - (1 + gBattleStruct->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask. - gBattleStruct->wrappedBy[gEffectBank] = gBankAttacker; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - while (gBattleCommunication[MULTISTRING_CHOOSER] <= 4 - && gCurrentMove != gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]]) - gBattleCommunication[MULTISTRING_CHOOSER]++; - break; - case 14: //25% recoil - gBattleMoveDamage = (gHpDealt) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 15 ... 21: //stat + 1 - if (ChangeStatBuffs(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one - gBattleStruct->animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - break; - case 22 ... 28: //stat - 1 - if (ChangeStatBuffs(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly - else - { - gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - gBattleStruct->animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatDown; - } - break; - case 39 ... 45: //stat + 2 - if (ChangeStatBuffs(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - gBattleStruct->animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - break; - case 46 ... 52: //stat - 2 - if (ChangeStatBuffs(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - gBattleStruct->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - gBattleStruct->animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatDown; - } - break; - case 29: //recharge - gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; - gDisableStructs[gEffectBank].rechargeCounter = 2; - gLockedMoves[gEffectBank] = gCurrentMove; - gBattlescriptCurrInstr++; - break; - case 30: //rage - gBattleMons[gBankAttacker].status2 |= STATUS2_RAGE; - gBattlescriptCurrInstr++; - break; - case 31: //item steal - { - u8 side = GetBattlerSide(gBankAttacker); - if (GetBattlerSide(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) - {gBattlescriptCurrInstr++; return;} - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.knockedOffPokes[side] & gBitTable[gBattlerPartyIndexes[gBankAttacker]])) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].item && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_NoItemSteal; - gLastUsedAbility = gBattleMons[gBankTarget].ability; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - return; - } - if (gBattleMons[gBankAttacker].item) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].item == 0) - {gBattlescriptCurrInstr++; return;} - - gLastUsedItem = gBattleMons[gBankTarget].item; - USED_HELD_ITEM(bank) = gLastUsedItem; - gBattleMons[gBankTarget].item = 0; - - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); - MarkBufferBankForExecution(gBankAttacker); - - gActiveBattler = gBankTarget; - EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); - MarkBufferBankForExecution(gBankTarget); - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ItemSteal; - - CHOICED_MOVE(gBankTarget) = 0; - } - break; - case 32: //escape prevention - gBattleMons[gBankTarget].status2 |= STATUS2_RECHARGE; - gDisableStructs[gBankTarget].bankPreventingEscape = gBankAttacker; - gBattlescriptCurrInstr++; - break; - case 33: //nightmare - gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE; - gBattlescriptCurrInstr++; - break; - case 34: //ancientpower - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AllStatsUp; - return; - case 35: //break free rapidspin - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_RapidSpinAway; - return; - case 36: //paralysis removal - if (gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS) - { - gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); - gActiveBattler = gBankTarget; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); - MarkBufferBankForExecution(gActiveBattler); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; - } - else - {gBattlescriptCurrInstr++; return;} - break; - case 37: //superpower - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AtkDefDown; - return; - case 38: //33% recoil - gBattleMoveDamage = gHpDealt / 3; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 53: //thrash - if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) - { - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBank] = gCurrentMove; - gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA); - } - else - {gBattlescriptCurrInstr++; return;} - break; - case 54: //knock off - if (gBattleMons[gEffectBank].ability == ABILITY_STICKY_HOLD) - { - if (gBattleMons[gEffectBank].item == 0) - {gBattlescriptCurrInstr++; return;} - gLastUsedAbility = ABILITY_STICKY_HOLD; - gBattlescriptCurrInstr = BattleScript_NoItemSteal; - RecordAbilityBattle(gEffectBank, ABILITY_STICKY_HOLD); - return; - } - if (gBattleMons[gEffectBank].item == 0) - {gBattlescriptCurrInstr++; return;} - else - { - u8 side = GetBattlerSide(gEffectBank); - gLastUsedItem = gBattleMons[gEffectBank].item; - gBattleMons[gEffectBank].item = 0; - gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlerPartyIndexes[gEffectBank]]; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_KnockedOff; - - CHOICED_MOVE(gEffectBank) = 0; - } - break; - case 59: //overheat - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SAtkDown2; - return; - } - } -} -#else -NAKED -void SetMoveEffect(bool8 primary, u8 certainArg) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - movs r0, 0\n\ - mov r10, r0\n\ - movs r6, 0\n\ - movs r1, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldr r1, _0801E430 @ =gBattleCommunication\n\ - ldrb r3, [r1, 0x3]\n\ - movs r0, 0x40\n\ - ands r0, r3\n\ - adds r7, r1, 0\n\ - cmp r0, 0\n\ - beq _0801E444\n\ - ldr r2, _0801E434 @ =gEffectBank\n\ - ldr r0, _0801E438 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - strb r0, [r2]\n\ - movs r0, 0xBF\n\ - ands r0, r3\n\ - strb r0, [r7, 0x3]\n\ - movs r6, 0x40\n\ - ldr r0, _0801E43C @ =gSharedMem\n\ - ldr r1, _0801E440 @ =gBankTarget\n\ - b _0801E450\n\ - .align 2, 0\n\ -_0801E430: .4byte gBattleCommunication\n\ -_0801E434: .4byte gEffectBank\n\ -_0801E438: .4byte gBankAttacker\n\ -_0801E43C: .4byte gSharedMem\n\ -_0801E440: .4byte gBankTarget\n\ -_0801E444:\n\ - ldr r2, _0801E538 @ =gEffectBank\n\ - ldr r0, _0801E53C @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - strb r0, [r2]\n\ - ldr r0, _0801E540 @ =gSharedMem\n\ - ldr r1, _0801E544 @ =gBankAttacker\n\ -_0801E450:\n\ - ldrb r1, [r1]\n\ - ldr r3, _0801E548 @ =0x00016003\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ - mov r8, r2\n\ - ldr r2, _0801E54C @ =gBattleMons\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x13\n\ - bne _0801E48A\n\ - ldr r0, _0801E550 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E48A\n\ - cmp r4, 0\n\ - bne _0801E48A\n\ - ldrb r0, [r7, 0x3]\n\ - cmp r0, 0x9\n\ - bhi _0801E48A\n\ - bl _0801F5DC\n\ -_0801E48A:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - bl GetBattlerPosition\n\ - ldr r2, _0801E554 @ =gSideAffecting\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - lsls r1, 1\n\ - adds r1, r2\n\ - ldrh r1, [r1]\n\ - movs r0, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E4C4\n\ - ldr r0, _0801E550 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E4C4\n\ - cmp r4, 0\n\ - bne _0801E4C4\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - cmp r0, 0x7\n\ - bhi _0801E4C4\n\ - bl _0801F5DC\n\ -_0801E4C4:\n\ - ldr r3, _0801E54C @ =gBattleMons\n\ - ldr r2, _0801E538 @ =gEffectBank\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r3\n\ - ldrh r0, [r0, 0x28]\n\ - mov r8, r2\n\ - mov r9, r3\n\ - cmp r0, 0\n\ - bne _0801E4EA\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - cmp r0, 0xB\n\ - beq _0801E4EA\n\ - cmp r0, 0x1F\n\ - beq _0801E4EA\n\ - bl _0801F5DC\n\ -_0801E4EA:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r1, r9\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 17\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E50C\n\ - cmp r6, 0x40\n\ - beq _0801E50C\n\ - bl _0801F5DC\n\ -_0801E50C:\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r1, [r0, 0x3]\n\ - adds r7, r0, 0\n\ - cmp r1, 0x6\n\ - bls _0801E518\n\ - b _0801EB4A\n\ -_0801E518:\n\ - ldr r1, _0801E55C @ =sStatusFlagsForMoveEffects\n\ - ldrb r0, [r7, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - cmp r0, 0x10\n\ - bne _0801E528\n\ - b _0801E714\n\ -_0801E528:\n\ - cmp r0, 0x10\n\ - bhi _0801E560\n\ - cmp r0, 0x7\n\ - beq _0801E57A\n\ - cmp r0, 0x8\n\ - bne _0801E536\n\ - b _0801E630\n\ -_0801E536:\n\ - b _0801EA14\n\ - .align 2, 0\n\ -_0801E538: .4byte gEffectBank\n\ -_0801E53C: .4byte gBankTarget\n\ -_0801E540: .4byte gSharedMem\n\ -_0801E544: .4byte gBankAttacker\n\ -_0801E548: .4byte 0x00016003\n\ -_0801E54C: .4byte gBattleMons\n\ -_0801E550: .4byte gHitMarker\n\ -_0801E554: .4byte gSideAffecting\n\ -_0801E558: .4byte gBattleCommunication\n\ -_0801E55C: .4byte sStatusFlagsForMoveEffects\n\ -_0801E560:\n\ - cmp r0, 0x40\n\ - bne _0801E566\n\ - b _0801E888\n\ -_0801E566:\n\ - cmp r0, 0x40\n\ - bhi _0801E572\n\ - cmp r0, 0x20\n\ - bne _0801E570\n\ - b _0801E7EA\n\ -_0801E570:\n\ - b _0801EA14\n\ -_0801E572:\n\ - cmp r0, 0x80\n\ - bne _0801E578\n\ - b _0801E8E4\n\ -_0801E578:\n\ - b _0801EA14\n\ -_0801E57A:\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x2B\n\ - beq _0801E5DC\n\ - ldr r0, _0801E5D4 @ =gActiveBattler\n\ - movs r1, 0\n\ - strb r1, [r0]\n\ - ldr r1, _0801E5D8 @ =gBattlersCount\n\ - ldrb r3, [r1]\n\ - adds r7, r0, 0\n\ - mov r12, r1\n\ - cmp r3, 0\n\ - beq _0801E5E8\n\ - mov r4, r9\n\ - ldr r0, [r4, 0x50]\n\ - movs r1, 0x70\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E5E8\n\ - adds r1, r7, 0\n\ - mov r6, r9\n\ - adds r6, 0x50\n\ - movs r5, 0x58\n\ - movs r4, 0x70\n\ -_0801E5B4:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, r3\n\ - bcs _0801E5E8\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _0801E5B4\n\ - b _0801E5E8\n\ - .align 2, 0\n\ -_0801E5D4: .4byte gActiveBattler\n\ -_0801E5D8: .4byte gBattlersCount\n\ -_0801E5DC:\n\ - ldr r0, _0801E628 @ =gActiveBattler\n\ - ldr r2, _0801E62C @ =gBattlersCount\n\ - ldrb r1, [r2]\n\ - strb r1, [r0]\n\ - adds r7, r0, 0\n\ - mov r12, r2\n\ -_0801E5E8:\n\ - mov r0, r8\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - adds r1, r2, 0\n\ - muls r1, r0\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E600\n\ - b _0801EA14\n\ -_0801E600:\n\ - ldrb r0, [r7]\n\ - mov r3, r12\n\ - ldrb r3, [r3]\n\ - cmp r0, r3\n\ - beq _0801E60C\n\ - b _0801EA14\n\ -_0801E60C:\n\ - mov r4, r9\n\ - adds r0, r1, r4\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x48\n\ - bne _0801E61A\n\ - b _0801EA14\n\ -_0801E61A:\n\ - cmp r0, 0xF\n\ - bne _0801E620\n\ - b _0801EA14\n\ -_0801E620:\n\ - adds r0, r2, 0\n\ - bl CancelMultiTurnMoves\n\ - b _0801EA04\n\ - .align 2, 0\n\ -_0801E628: .4byte gActiveBattler\n\ -_0801E62C: .4byte gBattlersCount\n\ -_0801E630:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x11\n\ - bne _0801E688\n\ - cmp r4, 0x1\n\ - beq _0801E64A\n\ - cmp r5, 0x80\n\ - bne _0801E688\n\ -_0801E64A:\n\ - ldr r0, _0801E678 @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x11\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E67C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E680 @ =BattleScript_PSNPrevention\n\ -_0801E664:\n\ - str r0, [r4]\n\ - ldr r2, _0801E684 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E676\n\ - b _0801E928\n\ -_0801E676:\n\ - b _0801E94C\n\ - .align 2, 0\n\ -_0801E678: .4byte gLastUsedAbility\n\ -_0801E67C: .4byte gBattlescriptCurrInstr\n\ -_0801E680: .4byte BattleScript_PSNPrevention\n\ -_0801E684: .4byte gHitMarker\n\ -_0801E688:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r1, r0, 0\n\ - adds r1, 0x21\n\ - ldrb r1, [r1]\n\ - cmp r1, 0x3\n\ - beq _0801E6AC\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801E6AC\n\ - cmp r1, 0x8\n\ - beq _0801E6AC\n\ - cmp r0, 0x8\n\ - bne _0801E6C6\n\ -_0801E6AC:\n\ - ldr r0, _0801E710 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E6C6\n\ - cmp r4, 0x1\n\ - bne _0801E6C0\n\ - b _0801E98C\n\ -_0801E6C0:\n\ - cmp r5, 0x80\n\ - bne _0801E6C6\n\ - b _0801E98C\n\ -_0801E6C6:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r4, r9\n\ - adds r3, r1, r4\n\ - adds r0, r3, 0\n\ - adds r0, 0x21\n\ - ldrb r4, [r0]\n\ - cmp r4, 0x3\n\ - bne _0801E6DE\n\ - b _0801EA14\n\ -_0801E6DE:\n\ - adds r0, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - bne _0801E6E8\n\ - b _0801EA14\n\ -_0801E6E8:\n\ - cmp r4, 0x8\n\ - bne _0801E6EE\n\ - b _0801EA14\n\ -_0801E6EE:\n\ - cmp r0, 0x8\n\ - bne _0801E6F4\n\ - b _0801EA14\n\ -_0801E6F4:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E702\n\ - b _0801EA14\n\ -_0801E702:\n\ - adds r0, r3, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - bne _0801E70E\n\ - b _0801EA14\n\ -_0801E70E:\n\ - b _0801EA04\n\ - .align 2, 0\n\ -_0801E710: .4byte gHitMarker\n\ -_0801E714:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x29\n\ - bne _0801E758\n\ - cmp r4, 0x1\n\ - beq _0801E72E\n\ - cmp r5, 0x80\n\ - bne _0801E758\n\ -_0801E72E:\n\ - ldr r0, _0801E74C @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x29\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E750 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E754 @ =BattleScript_BRNPrevention\n\ - b _0801E664\n\ - .align 2, 0\n\ -_0801E74C: .4byte gLastUsedAbility\n\ -_0801E750: .4byte gBattlescriptCurrInstr\n\ -_0801E754: .4byte BattleScript_BRNPrevention\n\ -_0801E758:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r2, r9\n\ - adds r1, r0, r2\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - beq _0801E778\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7A8\n\ -_0801E778:\n\ - ldr r0, _0801E79C @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E7A8\n\ - cmp r4, 0x1\n\ - beq _0801E78E\n\ - cmp r5, 0x80\n\ - bne _0801E7A8\n\ -_0801E78E:\n\ - ldr r4, _0801E7A0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E7A4 @ =BattleScript_BRNPrevention\n\ - b _0801E998\n\ - .align 2, 0\n\ -_0801E79C: .4byte gHitMarker\n\ -_0801E7A0: .4byte gBattlescriptCurrInstr\n\ -_0801E7A4: .4byte BattleScript_BRNPrevention\n\ -_0801E7A8:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x58\n\ - adds r2, r0, 0\n\ - muls r2, r1\n\ - mov r4, r9\n\ - adds r1, r2, r4\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7C2\n\ - b _0801EA14\n\ -_0801E7C2:\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7CE\n\ - b _0801EA14\n\ -_0801E7CE:\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x29\n\ - bne _0801E7DA\n\ - b _0801EA14\n\ -_0801E7DA:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E7E8\n\ - b _0801EA14\n\ -_0801E7E8:\n\ - b _0801EA04\n\ -_0801E7EA:\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x13\n\ - movs r1, 0\n\ - movs r2, 0xD\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _0801E826\n\ - str r0, [sp]\n\ - movs r0, 0x13\n\ - movs r1, 0\n\ - movs r2, 0x4D\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0801E826\n\ - ldr r0, _0801E87C @ =gBattleWeather\n\ - ldrh r1, [r0]\n\ - movs r0, 0x60\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E826\n\ - movs r1, 0\n\ - str r1, [sp, 0x4]\n\ -_0801E826:\n\ - ldr r4, _0801E880 @ =gBattleMons\n\ - ldr r0, _0801E884 @ =gEffectBank\n\ - ldrb r3, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r3, 0\n\ - muls r2, r0\n\ - adds r1, r2, r4\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xF\n\ - bne _0801E840\n\ - b _0801EA14\n\ -_0801E840:\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xF\n\ - bne _0801E84C\n\ - b _0801EA14\n\ -_0801E84C:\n\ - adds r0, r4, 0\n\ - adds r0, 0x4C\n\ - adds r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E85A\n\ - b _0801EA14\n\ -_0801E85A:\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, 0\n\ - bne _0801E862\n\ - b _0801EA14\n\ -_0801E862:\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x28\n\ - bne _0801E86E\n\ - b _0801EA14\n\ -_0801E86E:\n\ - adds r0, r3, 0\n\ - bl CancelMultiTurnMoves\n\ - movs r3, 0x1\n\ - mov r10, r3\n\ - b _0801EA14\n\ - .align 2, 0\n\ -_0801E87C: .4byte gBattleWeather\n\ -_0801E880: .4byte gBattleMons\n\ -_0801E884: .4byte gEffectBank\n\ -_0801E888:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r2, r9\n\ - adds r0, r1, r2\n\ - adds r0, 0x20\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x7\n\ - bne _0801E8D0\n\ - cmp r4, 0x1\n\ - beq _0801E8A6\n\ - cmp r5, 0x80\n\ - beq _0801E8A6\n\ - b _0801EA14\n\ -_0801E8A6:\n\ - ldr r0, _0801E8C4 @ =gLastUsedAbility\n\ - strb r2, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x7\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E8C8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E8CC @ =BattleScript_PRLZPrevention\n\ - b _0801E664\n\ - .align 2, 0\n\ -_0801E8C4: .4byte gLastUsedAbility\n\ -_0801E8C8: .4byte gBattlescriptCurrInstr\n\ -_0801E8CC: .4byte BattleScript_PRLZPrevention\n\ -_0801E8D0:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E8DE\n\ - b _0801EA14\n\ -_0801E8DE:\n\ - movs r4, 0x1\n\ - mov r10, r4\n\ - b _0801EA14\n\ -_0801E8E4:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x11\n\ - bne _0801E952\n\ - cmp r4, 0x1\n\ - beq _0801E8FE\n\ - cmp r5, 0x80\n\ - bne _0801E952\n\ -_0801E8FE:\n\ - ldr r0, _0801E938 @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x11\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E93C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E940 @ =BattleScript_PSNPrevention\n\ - str r0, [r4]\n\ - ldr r2, _0801E944 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E94C\n\ -_0801E928:\n\ - movs r0, 0x1\n\ - strb r0, [r7, 0x5]\n\ - ldr r0, _0801E948 @ =0xffffdfff\n\ - ands r1, r0\n\ - str r1, [r2]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801E938: .4byte gLastUsedAbility\n\ -_0801E93C: .4byte gBattlescriptCurrInstr\n\ -_0801E940: .4byte BattleScript_PSNPrevention\n\ -_0801E944: .4byte gHitMarker\n\ -_0801E948: .4byte 0xffffdfff\n\ -_0801E94C:\n\ - strb r0, [r7, 0x5]\n\ - bl _0801F5FA\n\ -_0801E952:\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r1, r0, 0\n\ - adds r1, 0x21\n\ - ldrb r1, [r1]\n\ - cmp r1, 0x3\n\ - beq _0801E976\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801E976\n\ - cmp r1, 0x8\n\ - beq _0801E976\n\ - cmp r0, 0x8\n\ - bne _0801E9B4\n\ -_0801E976:\n\ - ldr r0, _0801E9A4 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E9B4\n\ - cmp r4, 0x1\n\ - beq _0801E98C\n\ - cmp r5, 0x80\n\ - bne _0801E9B4\n\ -_0801E98C:\n\ - ldr r4, _0801E9A8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801E9AC @ =BattleScript_PSNPrevention\n\ -_0801E998:\n\ - str r0, [r4]\n\ - ldr r1, _0801E9B0 @ =gBattleCommunication\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x5]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801E9A4: .4byte gHitMarker\n\ -_0801E9A8: .4byte gBattlescriptCurrInstr\n\ -_0801E9AC: .4byte BattleScript_PSNPrevention\n\ -_0801E9B0: .4byte gBattleCommunication\n\ -_0801E9B4:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r6, 0x58\n\ - muls r0, r6\n\ - mov r2, r9\n\ - adds r2, 0x4C\n\ - adds r5, r0, r2\n\ - ldr r4, [r5]\n\ - cmp r4, 0\n\ - bne _0801EA14\n\ - mov r3, r9\n\ - adds r1, r0, r3\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r3, [r0]\n\ - cmp r3, 0x3\n\ - beq _0801EA0A\n\ - adds r0, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801EA0A\n\ - cmp r3, 0x8\n\ - beq _0801EA0A\n\ - cmp r0, 0x8\n\ - beq _0801EA0A\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - beq _0801EA14\n\ - mov r4, r8\n\ - ldrb r0, [r4]\n\ - adds r1, r0, 0\n\ - muls r1, r6\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - movs r2, 0x9\n\ - negs r2, r2\n\ - ands r0, r2\n\ - str r0, [r1]\n\ -_0801EA04:\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ - b _0801EA14\n\ -_0801EA0A:\n\ - ldr r0, _0801EA58 @ =gMoveResultFlags\n\ - ldrb r1, [r0]\n\ - movs r2, 0x8\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_0801EA14:\n\ - mov r1, r10\n\ - cmp r1, 0x1\n\ - beq _0801EA1C\n\ - b _0801EB3C\n\ -_0801EA1C:\n\ - ldr r0, _0801EA5C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EA60 @ =sStatusFlagsForMoveEffects\n\ - ldr r0, _0801EA64 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r3, [r0]\n\ - cmp r3, 0x7\n\ - bne _0801EA70\n\ - bl Random\n\ - ldr r2, _0801EA68 @ =gBattleMons\n\ - ldr r1, _0801EA6C @ =gEffectBank\n\ - ldrb r3, [r1]\n\ - movs r1, 0x58\n\ - muls r3, r1\n\ - adds r2, 0x4C\n\ - adds r3, r2\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - ldr r0, [r3]\n\ - orrs r0, r1\n\ - str r0, [r3]\n\ - b _0801EA84\n\ - .align 2, 0\n\ -_0801EA58: .4byte gMoveResultFlags\n\ -_0801EA5C: .4byte gBattlescriptCurrInstr\n\ -_0801EA60: .4byte sStatusFlagsForMoveEffects\n\ -_0801EA64: .4byte gBattleCommunication\n\ -_0801EA68: .4byte gBattleMons\n\ -_0801EA6C: .4byte gEffectBank\n\ -_0801EA70:\n\ - ldr r2, _0801EAD4 @ =gBattleMons\n\ - ldr r0, _0801EAD8 @ =gEffectBank\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - adds r2, 0x4C\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - orrs r0, r3\n\ - str r0, [r1]\n\ -_0801EA84:\n\ - ldr r2, _0801EADC @ =gBattlescriptCurrInstr\n\ - ldr r1, _0801EAE0 @ =gMoveEffectBS_Ptrs\n\ - ldr r5, _0801EAE4 @ =gBattleCommunication\n\ - ldrb r0, [r5, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - str r0, [r2]\n\ - ldr r4, _0801EAE8 @ =gActiveBattler\n\ - ldr r1, _0801EAD8 @ =gEffectBank\n\ - ldrb r0, [r1]\n\ - strb r0, [r4]\n\ - ldrb r1, [r1]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - ldr r1, _0801EAEC @ =gBattleMons+0x4C @ gBattleMons.status1\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetMonData\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r2, _0801EAF0 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801EAF8\n\ - movs r0, 0x1\n\ - strb r0, [r5, 0x5]\n\ - ldr r0, _0801EAF4 @ =0xffffdfff\n\ - ands r1, r0\n\ - str r1, [r2]\n\ - b _0801EAFA\n\ - .align 2, 0\n\ -_0801EAD4: .4byte gBattleMons\n\ -_0801EAD8: .4byte gEffectBank\n\ -_0801EADC: .4byte gBattlescriptCurrInstr\n\ -_0801EAE0: .4byte gMoveEffectBS_Ptrs\n\ -_0801EAE4: .4byte gBattleCommunication\n\ -_0801EAE8: .4byte gActiveBattler\n\ -_0801EAEC: .4byte gBattleMons+0x4C @ gBattleMons.status1\n\ -_0801EAF0: .4byte gHitMarker\n\ -_0801EAF4: .4byte 0xffffdfff\n\ -_0801EAF8:\n\ - strb r0, [r5, 0x5]\n\ -_0801EAFA:\n\ - ldr r0, _0801EB2C @ =gBattleCommunication\n\ - ldrb r2, [r0, 0x3]\n\ - adds r7, r0, 0\n\ - cmp r2, 0x2\n\ - beq _0801EB14\n\ - cmp r2, 0x6\n\ - beq _0801EB14\n\ - cmp r2, 0x5\n\ - beq _0801EB14\n\ - cmp r2, 0x3\n\ - beq _0801EB14\n\ - bl _0801F5FA\n\ -_0801EB14:\n\ - ldr r0, _0801EB30 @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - ldr r2, _0801EB34 @ =0x000160ca\n\ - adds r0, r2\n\ - strb r1, [r0]\n\ - ldr r2, _0801EB38 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 7\n\ - bl _0801F4F2\n\ - .align 2, 0\n\ -_0801EB2C: .4byte gBattleCommunication\n\ -_0801EB30: .4byte gSharedMem\n\ -_0801EB34: .4byte 0x000160ca\n\ -_0801EB38: .4byte gHitMarker\n\ -_0801EB3C:\n\ - mov r3, r10\n\ - cmp r3, 0\n\ - beq _0801EB46\n\ - bl _0801F5FA\n\ -_0801EB46:\n\ - bl _0801F5DC\n\ -_0801EB4A:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r1, r0\n\ - ldr r2, _0801EB84 @ =sStatusFlagsForMoveEffects\n\ - ldrb r3, [r7, 0x3]\n\ - lsls r0, r3, 2\n\ - adds r0, r2\n\ - ldr r1, [r1]\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801EB6E\n\ - bl _0801F5DC\n\ -_0801EB6E:\n\ - subs r0, r3, 0x7\n\ - cmp r0, 0x34\n\ - bls _0801EB78\n\ - bl _0801F5FA\n\ -_0801EB78:\n\ - lsls r0, 2\n\ - ldr r1, _0801EB88 @ =_0801EB8C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0801EB84: .4byte sStatusFlagsForMoveEffects\n\ -_0801EB88: .4byte _0801EB8C\n\ - .align 2, 0\n\ -_0801EB8C:\n\ - .4byte _0801EC60\n\ - .4byte _0801ECD4\n\ - .4byte _0801EE4C\n\ - .4byte _0801ED60\n\ - .4byte _0801EDDC\n\ - .4byte _0801EE84\n\ - .4byte _0801EECC\n\ - .4byte _0801EFA8\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F13C\n\ - .4byte _0801F184\n\ - .4byte _0801F1A4\n\ - .4byte _0801F364\n\ - .4byte _0801F3A0\n\ - .4byte _0801F3BC\n\ - .4byte _0801F3D4\n\ - .4byte _0801F3EC\n\ - .4byte _0801F44C\n\ - .4byte _0801F464\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F4A8\n\ - .4byte _0801F500\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5EC\n\ -_0801EC60:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r5, 0x58\n\ - adds r1, r0, 0\n\ - muls r1, r5\n\ - mov r2, r9\n\ - adds r0, r1, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x14\n\ - bne _0801EC7A\n\ - bl _0801F5DC\n\ -_0801EC7A:\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r0, r1, r4\n\ - ldr r0, [r0]\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801EC8E\n\ - bl _0801F5DC\n\ -_0801EC8E:\n\ - bl Random\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - lsls r0, 16\n\ - movs r1, 0xC0\n\ - lsls r1, 10\n\ - ands r1, r0\n\ - lsrs r1, 16\n\ - adds r1, 0x2\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0801ECC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801ECCC @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801ECD0 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801ECC8: .4byte gBattlescriptCurrInstr\n\ -_0801ECCC: .4byte gMoveEffectBS_Ptrs\n\ -_0801ECD0: .4byte gBattleCommunication\n\ -_0801ECD4:\n\ - mov r0, r8\n\ - ldrb r2, [r0]\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x27\n\ - bne _0801ED18\n\ - cmp r4, 0x1\n\ - beq _0801ECF4\n\ - cmp r5, 0x80\n\ - beq _0801ECF4\n\ - bl _0801F5DC\n\ -_0801ECF4:\n\ - ldr r0, _0801ED0C @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x27\n\ - bl RecordAbilityBattle\n\ - ldr r1, _0801ED10 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801ED14 @ =BattleScript_FlinchPrevention\n\ - str r0, [r1]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801ED0C: .4byte gLastUsedAbility\n\ -_0801ED10: .4byte gBattlescriptCurrInstr\n\ -_0801ED14: .4byte BattleScript_FlinchPrevention\n\ -_0801ED18:\n\ - adds r0, r2, 0\n\ - bl BankGetTurnOrder\n\ - ldr r1, _0801ED54 @ =gCurrentTurnActionNumber\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bhi _0801ED2E\n\ - bl _0801F5DC\n\ -_0801ED2E:\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - adds r2, r0, 0\n\ - muls r2, r6\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r1, _0801ED58 @ =sStatusFlagsForMoveEffects\n\ - ldr r0, _0801ED5C @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r1, [r2]\n\ - ldr r0, [r0]\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - bl _0801F5DC\n\ - .align 2, 0\n\ -_0801ED54: .4byte gCurrentTurnActionNumber\n\ -_0801ED58: .4byte sStatusFlagsForMoveEffects\n\ -_0801ED5C: .4byte gBattleCommunication\n\ -_0801ED60:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r2, r0, r4\n\ - ldr r1, [r2]\n\ - movs r0, 0x70\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801ED7C\n\ - bl _0801F5DC\n\ -_0801ED7C:\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - ldr r1, _0801EDC8 @ =gLockedMoves\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801EDCC @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - lsls r1, 4\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0801EDD0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EDD4 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EDD8 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801EDC8: .4byte gLockedMoves\n\ -_0801EDCC: .4byte gCurrentMove\n\ -_0801EDD0: .4byte gBattlescriptCurrInstr\n\ -_0801EDD4: .4byte gMoveEffectBS_Ptrs\n\ -_0801EDD8: .4byte gBattleCommunication\n\ -_0801EDDC:\n\ - ldr r5, _0801EE30 @ =gBankAttacker\n\ - ldrb r0, [r5]\n\ - bl GetBattlerPosition\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0801EE14\n\ - ldr r4, _0801EE34 @ =gPaydayMoney\n\ - ldrh r3, [r4]\n\ - ldr r2, _0801EE38 @ =gBattleMons\n\ - ldrb r1, [r5]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - adds r0, 0x2A\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - adds r0, r3, r0\n\ - strh r0, [r4]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r3, r0\n\ - bls _0801EE14\n\ - ldr r3, _0801EE3C @ =0x0000ffff\n\ - adds r0, r3, 0\n\ - strh r0, [r4]\n\ -_0801EE14:\n\ - ldr r4, _0801EE40 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EE44 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EE48 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801EE30: .4byte gBankAttacker\n\ -_0801EE34: .4byte gPaydayMoney\n\ -_0801EE38: .4byte gBattleMons\n\ -_0801EE3C: .4byte 0x0000ffff\n\ -_0801EE40: .4byte gBattlescriptCurrInstr\n\ -_0801EE44: .4byte gMoveEffectBS_Ptrs\n\ -_0801EE48: .4byte gBattleCommunication\n\ -_0801EE4C:\n\ - mov r4, r8\n\ - ldrb r1, [r4]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r1, r9\n\ - adds r1, 0x4C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801EE62\n\ - b _0801F5DC\n\ -_0801EE62:\n\ - bl Random\n\ - ldr r4, _0801EE80 @ =gBattleCommunication\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - adds r0, 0x3\n\ - strb r0, [r4, 0x3]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl SetMoveEffect\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801EE80: .4byte gBattleCommunication\n\ -_0801EE84:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 5\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r1, _0801EEC0 @ =gLockedMoves\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801EEC4 @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - ldr r0, _0801EEC8 @ =gProtectStructs\n\ - ldrb r1, [r2]\n\ - lsls r1, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - movs r2, 0x4\n\ - orrs r0, r2\n\ - strb r0, [r1, 0x1]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801EEC0: .4byte gLockedMoves\n\ -_0801EEC4: .4byte gCurrentMove\n\ -_0801EEC8: .4byte gProtectStructs\n\ -_0801EECC:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r6, 0x58\n\ - muls r0, r6\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r0, r4\n\ - ldr r5, [r0]\n\ - movs r0, 0xE0\n\ - lsls r0, 8\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - beq _0801EEE8\n\ - b _0801F5DC\n\ -_0801EEE8:\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r6\n\ - adds r2, r4\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x3\n\ - lsls r1, 13\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801EF80 @ =gSharedMem\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - ldr r4, _0801EF84 @ =0x00016004\n\ - adds r0, r4\n\ - adds r0, r2\n\ - ldr r6, _0801EF88 @ =gCurrentMove\n\ - ldrh r1, [r6]\n\ - strb r1, [r0]\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - ldr r1, _0801EF8C @ =0x00016005\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrh r1, [r6]\n\ - lsrs r1, 8\n\ - strb r1, [r0]\n\ - ldrb r0, [r3]\n\ - ldr r3, _0801EF90 @ =0x00016020\n\ - adds r0, r3\n\ - adds r0, r2\n\ - ldr r1, _0801EF94 @ =gBankAttacker\n\ - ldrb r1, [r1]\n\ - strb r1, [r0]\n\ - ldr r4, _0801EF98 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EF9C @ =gMoveEffectBS_Ptrs\n\ - ldr r2, _0801EFA0 @ =gBattleCommunication\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - str r0, [r4]\n\ - strb r5, [r2, 0x5]\n\ - ldr r1, _0801EFA4 @ =gTrappingMoves\n\ - ldrh r0, [r1]\n\ - ldrh r4, [r6]\n\ - cmp r0, r4\n\ - bne _0801EF5C\n\ - b _0801F5FA\n\ -_0801EF5C:\n\ - adds r3, r1, 0\n\ - adds r1, r6, 0\n\ -_0801EF60:\n\ - ldrb r0, [r2, 0x5]\n\ - adds r0, 0x1\n\ - strb r0, [r2, 0x5]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x4\n\ - bls _0801EF70\n\ - b _0801F5FA\n\ -_0801EF70:\n\ - ldrb r0, [r2, 0x5]\n\ - lsls r0, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - ldrh r4, [r1]\n\ - cmp r0, r4\n\ - bne _0801EF60\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801EF80: .4byte gSharedMem\n\ -_0801EF84: .4byte 0x00016004\n\ -_0801EF88: .4byte gCurrentMove\n\ -_0801EF8C: .4byte 0x00016005\n\ -_0801EF90: .4byte 0x00016020\n\ -_0801EF94: .4byte gBankAttacker\n\ -_0801EF98: .4byte gBattlescriptCurrInstr\n\ -_0801EF9C: .4byte gMoveEffectBS_Ptrs\n\ -_0801EFA0: .4byte gBattleCommunication\n\ -_0801EFA4: .4byte gTrappingMoves\n\ -_0801EFA8:\n\ - ldr r1, _0801EFD8 @ =gBattleMoveDamage\n\ - ldr r0, _0801EFDC @ =gHpDealt\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bge _0801EFB4\n\ - adds r0, 0x3\n\ -_0801EFB4:\n\ - asrs r0, 2\n\ - str r0, [r1]\n\ - cmp r0, 0\n\ - bne _0801EFC0\n\ - movs r0, 0x1\n\ - str r0, [r1]\n\ -_0801EFC0:\n\ - ldr r4, _0801EFE0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801EFE4 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EFE8 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801EFD8: .4byte gBattleMoveDamage\n\ -_0801EFDC: .4byte gHpDealt\n\ -_0801EFE0: .4byte gBattlescriptCurrInstr\n\ -_0801EFE4: .4byte gMoveEffectBS_Ptrs\n\ -_0801EFE8: .4byte gBattleCommunication\n\ -_0801EFEC:\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xF2\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - movs r0, 0x10\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F008\n\ - b _0801F5DC\n\ -_0801F008:\n\ - ldr r2, _0801F02C @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F030 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F034 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F038 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F03C @ =BattleScript_StatUp\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F02C: .4byte gSharedMem\n\ -_0801F030: .4byte 0x000160a4\n\ -_0801F034: .4byte 0x000160a5\n\ -_0801F038: .4byte gBattlescriptCurrInstr\n\ -_0801F03C: .4byte BattleScript_StatUp\n\ -_0801F040:\n\ - movs r0, 0x70\n\ - negs r0, r0\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xEB\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F05E\n\ - b _0801F5DC\n\ -_0801F05E:\n\ - ldr r2, _0801F080 @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F084 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F088 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F08C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F090 @ =BattleScript_StatDown\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F080: .4byte gSharedMem\n\ -_0801F084: .4byte 0x000160a4\n\ -_0801F088: .4byte 0x000160a5\n\ -_0801F08C: .4byte gBattlescriptCurrInstr\n\ -_0801F090: .4byte BattleScript_StatDown\n\ -_0801F094:\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xDA\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - movs r0, 0x20\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F0B0\n\ - b _0801F5DC\n\ -_0801F0B0:\n\ - ldr r2, _0801F0D4 @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F0D8 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F0DC @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F0E0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F0E4 @ =BattleScript_StatUp\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F0D4: .4byte gSharedMem\n\ -_0801F0D8: .4byte 0x000160a4\n\ -_0801F0DC: .4byte 0x000160a5\n\ -_0801F0E0: .4byte gBattlescriptCurrInstr\n\ -_0801F0E4: .4byte BattleScript_StatUp\n\ -_0801F0E8:\n\ - movs r0, 0x60\n\ - negs r0, r0\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xD3\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F106\n\ - b _0801F5DC\n\ -_0801F106:\n\ - ldr r2, _0801F128 @ =gSharedMem\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F12C @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F130 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F134 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F138 @ =BattleScript_StatDown\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F128: .4byte gSharedMem\n\ -_0801F12C: .4byte 0x000160a4\n\ -_0801F130: .4byte 0x000160a5\n\ -_0801F134: .4byte gBattlescriptCurrInstr\n\ -_0801F138: .4byte BattleScript_StatDown\n\ -_0801F13C:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 15\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801F178 @ =gDisableStructs\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - lsls r0, r1, 3\n\ - subs r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - movs r1, 0x2\n\ - strb r1, [r0, 0x19]\n\ - ldr r1, _0801F17C @ =gLockedMoves\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801F180 @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F178: .4byte gDisableStructs\n\ -_0801F17C: .4byte gLockedMoves\n\ -_0801F180: .4byte gCurrentMove\n\ -_0801F184:\n\ - ldr r0, _0801F1A0 @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 16\n\ -_0801F19A:\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F1A0: .4byte gBankAttacker\n\ -_0801F1A4:\n\ - ldr r4, _0801F254 @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldrb r0, [r4]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0801F1D8\n\ - ldr r0, _0801F258 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0801F25C @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F214\n\ - ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0801F1D8\n\ - b _0801F5DC\n\ -_0801F1D8:\n\ - ldr r0, _0801F258 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0801F25C @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F214\n\ - ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0801F214\n\ - ldr r0, _0801F264 @ =gWishFutureKnock\n\ - adds r0, 0x29\n\ - adds r0, r6, r0\n\ - ldrb r1, [r0]\n\ - ldr r3, _0801F268 @ =gBitTable\n\ - ldr r2, _0801F26C @ =gBattlerPartyIndexes\n\ - ldr r0, _0801F254 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801F214\n\ - b _0801F5DC\n\ -_0801F214:\n\ - ldr r2, _0801F270 @ =gBattleMons\n\ - ldr r1, _0801F274 @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - movs r3, 0x58\n\ - muls r0, r3\n\ - adds r4, r0, r2\n\ - ldrh r0, [r4, 0x2E]\n\ - adds r7, r1, 0\n\ - mov r9, r2\n\ - cmp r0, 0\n\ - beq _0801F284\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3C\n\ - bne _0801F284\n\ - ldr r1, _0801F278 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801F27C @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldr r1, _0801F280 @ =gLastUsedAbility\n\ - ldrb r0, [r7]\n\ - muls r0, r3\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r7]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F254: .4byte gBankAttacker\n\ -_0801F258: .4byte gBattleTypeFlags\n\ -_0801F25C: .4byte 0x00000902\n\ -_0801F260: .4byte gTrainerBattleOpponent\n\ -_0801F264: .4byte gWishFutureKnock\n\ -_0801F268: .4byte gBitTable\n\ -_0801F26C: .4byte gBattlerPartyIndexes\n\ -_0801F270: .4byte gBattleMons\n\ -_0801F274: .4byte gBankTarget\n\ -_0801F278: .4byte gBattlescriptCurrInstr\n\ -_0801F27C: .4byte BattleScript_NoItemSteal\n\ -_0801F280: .4byte gLastUsedAbility\n\ -_0801F284:\n\ - ldr r4, _0801F340 @ =gBankAttacker\n\ - mov r10, r4\n\ - ldrb r1, [r4]\n\ - movs r0, 0x58\n\ - mov r8, r0\n\ - mov r0, r8\n\ - muls r0, r1\n\ - add r0, r9\n\ - ldrh r3, [r0, 0x2E]\n\ - cmp r3, 0\n\ - beq _0801F29C\n\ - b _0801F5DC\n\ -_0801F29C:\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - ldrh r2, [r0, 0x2E]\n\ - adds r0, r2, 0\n\ - cmp r0, 0xAF\n\ - bne _0801F2B0\n\ - b _0801F5DC\n\ -_0801F2B0:\n\ - cmp r0, 0\n\ - bne _0801F2B6\n\ - b _0801F5DC\n\ -_0801F2B6:\n\ - lsls r0, r1, 1\n\ - ldr r5, _0801F344 @ =gSharedMem + 0x160F0\n\ - adds r0, r5\n\ - ldr r1, _0801F348 @ =gLastUsedItem\n\ - strh r2, [r0]\n\ - strh r2, [r1]\n\ - ldrb r0, [r7]\n\ - mov r4, r8\n\ - muls r4, r0\n\ - adds r0, r4, 0\n\ - add r0, r9\n\ - movs r6, 0\n\ - strh r3, [r0, 0x2E]\n\ - ldr r4, _0801F34C @ =gActiveBattler\n\ - mov r2, r10\n\ - ldrb r0, [r2]\n\ - strb r0, [r4]\n\ - str r1, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetMonData\n\ - mov r3, r10\n\ - ldrb r0, [r3]\n\ - bl MarkBufferBankForExecution\n\ - ldrb r0, [r7]\n\ - strb r0, [r4]\n\ - ldrb r0, [r7]\n\ - mov r4, r8\n\ - muls r4, r0\n\ - adds r0, r4, 0\n\ - mov r1, r9\n\ - adds r1, 0x2E\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetMonData\n\ - ldrb r0, [r7]\n\ - bl MarkBufferBankForExecution\n\ - ldr r4, _0801F350 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F354 @ =BattleScript_ItemSteal\n\ - str r0, [r4]\n\ - ldr r0, _0801F358 @ =0xfffe9f10\n\ - adds r5, r0\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r1, _0801F35C @ =0x000160e8\n\ - adds r0, r1\n\ - adds r0, r5\n\ - strb r6, [r0]\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r2, _0801F360 @ =0x000160e9\n\ - adds r0, r2\n\ - adds r0, r5\n\ - strb r6, [r0]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F340: .4byte gBankAttacker\n\ -_0801F344: .4byte gSharedMem + 0x160F0\n\ -_0801F348: .4byte gLastUsedItem\n\ -_0801F34C: .4byte gActiveBattler\n\ -_0801F350: .4byte gBattlescriptCurrInstr\n\ -_0801F354: .4byte BattleScript_ItemSteal\n\ -_0801F358: .4byte 0xfffe9f10\n\ -_0801F35C: .4byte 0x000160e8\n\ -_0801F360: .4byte 0x000160e9\n\ -_0801F364:\n\ - ldr r3, _0801F394 @ =gBankTarget\n\ - ldrb r1, [r3]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 19\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801F398 @ =gDisableStructs\n\ - ldrb r1, [r3]\n\ - lsls r0, r1, 3\n\ - subs r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldr r1, _0801F39C @ =gBankAttacker\n\ - ldrb r1, [r1]\n\ - strb r1, [r0, 0x14]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F394: .4byte gBankTarget\n\ -_0801F398: .4byte gDisableStructs\n\ -_0801F39C: .4byte gBankAttacker\n\ -_0801F3A0:\n\ - ldr r0, _0801F3B8 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 20\n\ - b _0801F19A\n\ - .align 2, 0\n\ -_0801F3B8: .4byte gBankTarget\n\ -_0801F3BC:\n\ - ldr r4, _0801F3CC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F3D0 @ =BattleScript_AllStatsUp\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F3CC: .4byte gBattlescriptCurrInstr\n\ -_0801F3D0: .4byte BattleScript_AllStatsUp\n\ -_0801F3D4:\n\ - ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F3E8 @ =BattleScript_RapidSpinAway\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F3E4: .4byte gBattlescriptCurrInstr\n\ -_0801F3E8: .4byte BattleScript_RapidSpinAway\n\ -_0801F3EC:\n\ - ldr r6, _0801F43C @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - movs r2, 0x58\n\ - muls r0, r2\n\ - mov r1, r9\n\ - adds r1, 0x4C\n\ - adds r5, r0, r1\n\ - ldr r4, [r5]\n\ - movs r0, 0x40\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - bne _0801F406\n\ - b _0801F5DC\n\ -_0801F406:\n\ - movs r0, 0x41\n\ - negs r0, r0\n\ - ands r4, r0\n\ - str r4, [r5]\n\ - ldr r4, _0801F440 @ =gActiveBattler\n\ - ldrb r0, [r6]\n\ - strb r0, [r4]\n\ - ldrb r0, [r4]\n\ - muls r0, r2\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetMonData\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r4, _0801F444 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F448 @ =BattleScript_TargetPRLZHeal\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F43C: .4byte gBankTarget\n\ -_0801F440: .4byte gActiveBattler\n\ -_0801F444: .4byte gBattlescriptCurrInstr\n\ -_0801F448: .4byte BattleScript_TargetPRLZHeal\n\ -_0801F44C:\n\ - ldr r4, _0801F45C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F460 @ =BattleScript_AtkDefDown\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F45C: .4byte gBattlescriptCurrInstr\n\ -_0801F460: .4byte BattleScript_AtkDefDown\n\ -_0801F464:\n\ - ldr r4, _0801F494 @ =gBattleMoveDamage\n\ - ldr r0, _0801F498 @ =gHpDealt\n\ - ldr r0, [r0]\n\ - movs r1, 0x3\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - cmp r0, 0\n\ - bne _0801F47A\n\ - movs r0, 0x1\n\ - str r0, [r4]\n\ -_0801F47A:\n\ - ldr r4, _0801F49C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r1, _0801F4A0 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801F4A4 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F494: .4byte gBattleMoveDamage\n\ -_0801F498: .4byte gHpDealt\n\ -_0801F49C: .4byte gBattlescriptCurrInstr\n\ -_0801F4A0: .4byte gMoveEffectBS_Ptrs\n\ -_0801F4A4: .4byte gBattleCommunication\n\ -_0801F4A8:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r2, r0, r4\n\ - ldr r1, [r2]\n\ - movs r0, 0xC0\n\ - lsls r0, 4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801F4C4\n\ - b _0801F5DC\n\ -_0801F4C4:\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - ldr r1, _0801F4F8 @ =gLockedMoves\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801F4FC @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - lsls r1, 10\n\ - ldr r0, [r2]\n\ -_0801F4F2:\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F4F8: .4byte gLockedMoves\n\ -_0801F4FC: .4byte gCurrentMove\n\ -_0801F500:\n\ - mov r5, r8\n\ - ldrb r3, [r5]\n\ - movs r4, 0x58\n\ - adds r0, r3, 0\n\ - muls r0, r4\n\ - mov r2, r9\n\ - adds r1, r0, r2\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x3C\n\ - bne _0801F540\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0\n\ - beq _0801F5DC\n\ - ldr r0, _0801F534 @ =gLastUsedAbility\n\ - strb r2, [r0]\n\ - ldr r1, _0801F538 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801F53C @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldrb r0, [r5]\n\ - movs r1, 0x3C\n\ - bl RecordAbilityBattle\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F534: .4byte gLastUsedAbility\n\ -_0801F538: .4byte gBattlescriptCurrInstr\n\ -_0801F53C: .4byte BattleScript_NoItemSteal\n\ -_0801F540:\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0\n\ - beq _0801F5DC\n\ - adds r0, r3, 0\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r1, _0801F5B8 @ =gLastUsedItem\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r9\n\ - ldrh r0, [r0, 0x2E]\n\ - strh r0, [r1]\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r9\n\ - movs r5, 0\n\ - movs r1, 0\n\ - strh r1, [r0, 0x2E]\n\ - ldr r2, _0801F5BC @ =gWishFutureKnock\n\ - adds r2, 0x29\n\ - adds r2, r6, r2\n\ - ldr r3, _0801F5C0 @ =gBitTable\n\ - ldr r1, _0801F5C4 @ =gBattlerPartyIndexes\n\ - mov r4, r8\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r4, _0801F5C8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F5CC @ =BattleScript_KnockedOff\n\ - str r0, [r4]\n\ - ldr r1, _0801F5D0 @ =gSharedMem\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - ldr r3, _0801F5D4 @ =0x000160e8\n\ - adds r0, r3\n\ - adds r0, r1\n\ - strb r5, [r0]\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - ldr r4, _0801F5D8 @ =0x000160e9\n\ - adds r0, r4\n\ - adds r0, r1\n\ - strb r5, [r0]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F5B8: .4byte gLastUsedItem\n\ -_0801F5BC: .4byte gWishFutureKnock\n\ -_0801F5C0: .4byte gBitTable\n\ -_0801F5C4: .4byte gBattlerPartyIndexes\n\ -_0801F5C8: .4byte gBattlescriptCurrInstr\n\ -_0801F5CC: .4byte BattleScript_KnockedOff\n\ -_0801F5D0: .4byte gSharedMem\n\ -_0801F5D4: .4byte 0x000160e8\n\ -_0801F5D8: .4byte 0x000160e9\n\ -_0801F5DC:\n\ - ldr r1, _0801F5E8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F5E8: .4byte gBattlescriptCurrInstr\n\ -_0801F5EC:\n\ - ldr r4, _0801F60C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl BattleScriptPush\n\ - ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\ -_0801F5F8:\n\ - str r0, [r4]\n\ -_0801F5FA:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0801F60C: .4byte gBattlescriptCurrInstr\n\ -_0801F610: .4byte BattleScript_SAtkDown2\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -static void atk15_seteffectwithchance(void) -{ - u32 PercentChance; - - if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE) - PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2; - else - PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; - - if (DEBUG && (gUnknown_02023A14_50 & 4) - && !(gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - SetMoveEffect(0, 0); - } - else if ((gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] &= 0x7F; - SetMoveEffect(0, 0x80); - } - else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] != 0 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (PercentChance >= 100) - SetMoveEffect(0, 0x80); - else - SetMoveEffect(0, 0); - } - else - { - gBattlescriptCurrInstr++; - } - - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattleStruct->unk16112 = 0; -} - -static void atk16_seteffectprimary(void) -{ - SetMoveEffect(1, 0); -} - -static void atk17_seteffectsecondary(void) -{ - SetMoveEffect(0, 0); -} - -static void atk18_clearstatusfromeffect(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) - gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); - else - gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); - - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattlescriptCurrInstr += 2; - gBattleStruct->unk16112 = 0; -} - -static void atk19_tryfaintmon(void) -{ - u8 *r4; - - if (gBattlescriptCurrInstr[2] != 0) - { - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) - { - r4 = T1_READ_PTR(gBattlescriptCurrInstr + 3); - - BattleScriptPop(); - gBattlescriptCurrInstr = r4; - gSideAffecting[GetBattlerSide(gActiveBattler)] &= ~SIDE_STATUS_SPIKES_DAMAGED; - } - else - { - gBattlescriptCurrInstr += 7; - } - } - else - { - u8 bank; - - if (gBattlescriptCurrInstr[1] == 1) - { - gActiveBattler = gBankAttacker; - bank = gBankTarget; - r4 = BattleScript_FaintAttacker; - } - else - { - gActiveBattler = gBankTarget; - bank = gBankAttacker; - r4 = BattleScript_FaintTarget; - } - if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]) - && gBattleMons[gActiveBattler].hp == 0) - { - ewram160ACarr2(0, bank) = 0; - ewram160ACarr2(1, bank) = 0; - ewram16100arr2(0, bank) = 0; - ewram16100arr2(1, bank) = 0; - ewram16100arr2(2, bank) = 0; - ewram16100arr2(3, bank) = 0; - - gHitMarker |= HITMARKER_FAINTED(gActiveBattler); - BattleScriptPush(gBattlescriptCurrInstr + 7); - gBattlescriptCurrInstr = r4; - if (GetBattlerSide(gActiveBattler) == 0) - { - gHitMarker |= HITMARKER_x400000; - if (gBattleResults.playerFaintCounter < 0xFF) - gBattleResults.playerFaintCounter++; - if (gBattleMons[bank].level > gBattleMons[gActiveBattler].level) - { - if (gBattleMons[bank].level - gBattleMons[gActiveBattler].level > 29) - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], FRIENDSHIP_EVENT_FAINT_LARGE); - else - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], FRIENDSHIP_EVENT_FAINT_SMALL); - } - } - else - { - if (gBattleResults.opponentFaintCounter < 0xFF) - gBattleResults.opponentFaintCounter++; - gBattleResults.lastOpponentSpecies = gBattleMons[gActiveBattler].species; - } - if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0) - { - BattleScriptPush(gBattlescriptCurrInstr); - gBattleMoveDamage = gBattleMons[bank].hp; - gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; - } - if ((gStatuses3[gBankTarget] & STATUS3_GRUDGE) - && !(gHitMarker & HITMARKER_GRUDGE) - && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget) - && gBattleMons[gBankAttacker].hp != 0 - && gCurrentMove != MOVE_STRUGGLE) - { - u8 moveIndex = ewram1608Carr(gBankAttacker); - - gBattleMons[gBankAttacker].pp[moveIndex] = 0; - BattleScriptPush(gBattlescriptCurrInstr); - gBattlescriptCurrInstr = BattleScript_SelectingImprisionedMoveInPalace; - gActiveBattler = gBankAttacker; - EmitSetMonData(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); - MarkBufferBankForExecution(gActiveBattler); - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gBattleMons[gBankAttacker].moves[moveIndex]; - gBattleTextBuff1[3] = gBattleMons[gBankAttacker].moves[moveIndex] >> 8; - gBattleTextBuff1[4] = EOS; - } - } - else - { - gBattlescriptCurrInstr += 7; - } - } -} - -static void atk1A_dofaintanimation(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - Emitcmd10(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; - } -} - -static void atk1B_cleareffectsonfaint(void) -{ - //Clears things like attraction or trapping to other banks - if (gBattleExecBuffer == 0) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - gBattleMons[gActiveBattler].status1 = 0; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - UndoEffectsAfterFainting(); - gBattlescriptCurrInstr += 2; - } -} - -static void atk1C_jumpifstatus(void) -{ - u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); - void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 6); - if (gBattleMons[bank].status1 & flags && gBattleMons[bank].hp) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 10; -} - -static void atk1D_jumpifstatus2(void) -{ - u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); - void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 6); - if (gBattleMons[bank].status2 & flags && gBattleMons[bank].hp) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 10; -} - -static void atk1E_jumpifability(void) -{ - u8 bank; - u8 ability = T2_READ_8(gBattlescriptCurrInstr + 2); - void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 3); - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 8) - { - bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_BANK_SIDE, gBankAttacker, ability, 0, 0); - if (bank) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank -1, gLastUsedAbility); - ewram160F8 = bank - 1; - } - else - gBattlescriptCurrInstr += 7; - } - else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 9) - { - bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBankAttacker, ability, 0, 0); - if (bank) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank - 1, gLastUsedAbility); - ewram160F8 = bank - 1; - } - else - gBattlescriptCurrInstr += 7; - } - else - { - bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (gBattleMons[bank].ability == ability) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank, gLastUsedAbility); - ewram160F8 = bank; - } - else - gBattlescriptCurrInstr += 7; - } -} - -static void atk1F_jumpifsideaffecting(void) -{ - u8 side; - u16 flags; - void* jump_loc; - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1) - side = GetBattlerPosition(gBankAttacker) & 1; - else - side = GetBattlerPosition(gBankTarget) & 1; - - flags = T2_READ_16(gBattlescriptCurrInstr + 2); - jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 4); - - if (gSideAffecting[side] & flags) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 8; -} - -static void atk20_jumpifstat(void) -{ - u8 ret = 0; - u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - u8 value = gBattleMons[bank].statStages[T2_READ_8(gBattlescriptCurrInstr + 3)]; - switch (T2_READ_8(gBattlescriptCurrInstr + 2)) - { - case CMP_EQUAL: - if (value == T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_NOT_EQUAL: - if (value != T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_GREATER_THAN: - if (value > T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_LESS_THAN: - if (value < T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_COMMON_BITS: - if (value & T2_READ_8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_NO_COMMON_BITS: - if (!(value & T2_READ_8(gBattlescriptCurrInstr + 4))) - ret++; - break; - } - if (ret) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 5); - else - gBattlescriptCurrInstr += 9; -} - -static void atk21_jumpifstatus3condition(void) -{ - u32 flags; - void* jump_loc; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - flags = T2_READ_32(gBattlescriptCurrInstr + 2); - jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 7); - if (T2_READ_8(gBattlescriptCurrInstr + 6)) - { - if ((gStatuses3[gActiveBattler] & flags) != 0) - gBattlescriptCurrInstr += 11; - else - gBattlescriptCurrInstr = jump_loc; - } - else - { - if ((gStatuses3[gActiveBattler] & flags) != 0) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 11; - } -} - -static void atk22_jumpiftype(void) //u8 bank, u8 type, *ptr -{ - u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - u8 type = T2_READ_8(gBattlescriptCurrInstr + 2); - void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 3); - - if (gBattleMons[bank].type1 == type || gBattleMons[bank].type2 == type) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 7; -} - -static void atk23_getexp(void) -{ - u16 item; - s32 i; // also used as stringId - u8 holdEffect; - s32 sentIn; - - s32 viaExpShare = 0; - u16* exp = &gBattleStruct->exp; - - gBank1 = GetBattleBank(gBattlescriptCurrInstr[1]); - sentIn = gSentPokesToOpponent[(gBank1 & 2) >> 1]; - - switch (gBattleStruct->getexpStateTracker) - { - case 0: // check if should receive exp at all - if (GetBattlerSide(gBank1) != B_SIDE_OPPONENT || (gBattleTypeFlags & - (BATTLE_TYPE_LINK - | BATTLE_TYPE_SAFARI - | BATTLE_TYPE_BATTLE_TOWER - | BATTLE_TYPE_EREADER_TRAINER))) - { - gBattleStruct->getexpStateTracker = 6; // goto last case - } - else - { - gBattleStruct->getexpStateTracker++; - gBattleStruct->unk16113 |= gBitTable[gBattlerPartyIndexes[gBank1]]; - } - break; - case 1: // calculate experience points to redistribute - { - u16 calculatedExp; - s32 viaSentIn; - - for (viaSentIn = 0, i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - continue; - if (gBitTable[i] & sentIn) - viaSentIn++; - - item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - else - holdEffect = ItemId_GetHoldEffect(item); - - if (holdEffect == HOLD_EFFECT_EXP_SHARE) - viaExpShare++; - } - - calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7; - - if (viaExpShare) // at least one mon is getting exp via exp share - { - *exp = calculatedExp / 2 / viaSentIn; - if (*exp == 0) - *exp = 1; - - gExpShareExp = calculatedExp / 2 / viaExpShare; - if (gExpShareExp == 0) - gExpShareExp = 1; - } - else - { - *exp = calculatedExp / viaSentIn; - if (*exp == 0) - *exp = 1; - gExpShareExp = 0; - } - - gBattleStruct->getexpStateTracker++; - gBattleStruct->expGetterID = 0; - gBattleStruct->sentInPokes = sentIn; - } - // fall through - case 2: // set exp value to the poke in expgetter_id and print message - if (gBattleExecBuffer == 0) - { - item = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HELD_ITEM); - - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - else - holdEffect = ItemId_GetHoldEffect(item); - - if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1)) - { - gBattleStruct->sentInPokes >>= 1; - gBattleStruct->getexpStateTracker = 5; - gBattleMoveDamage = 0; // used for exp - } - else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) == 100) - { - gBattleStruct->sentInPokes >>= 1; - gBattleStruct->getexpStateTracker = 5; - gBattleMoveDamage = 0; // used for exp - } - else - { - // music change in wild battle after fainting a poke - if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong) - { - BattleStopLowHpSound(); - PlayBGM(0x161); - gBattleStruct->wildVictorySong++; - } - - if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP)) - { - if (gBattleStruct->sentInPokes & 1) - gBattleMoveDamage = *exp; - else - gBattleMoveDamage = 0; - - if (holdEffect == HOLD_EFFECT_EXP_SHARE) - gBattleMoveDamage += gExpShareExp; - if (holdEffect == HOLD_EFFECT_LUCKY_EGG) - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - - if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterID])) - { - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - i = 0x14A; - } - else - { - i = 0x149; - } - - // get exp getter bank - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterID) && !(gAbsentBattlerFlags & gBitTable[2])) - gBattleStruct->expGetterBank = 2; - else - { - if (!(gAbsentBattlerFlags & gBitTable[0])) - gBattleStruct->expGetterBank = 0; - else - gBattleStruct->expGetterBank = 2; - } - } - else - gBattleStruct->expGetterBank = 0; - - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBank, gBattleStruct->expGetterID) - - // buffer 'gained' or 'gained a boosted' - PREPARE_STRING_BUFFER(gBattleTextBuff2, i) - - PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage) - - PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBank); - MonGainEVs(&gPlayerParty[gBattleStruct->expGetterID], gBattleMons[gBank1].species); - } - gBattleStruct->sentInPokes >>= 1; - gBattleStruct->getexpStateTracker++; - } - } - break; - case 3: // Set stats and give exp - if (gBattleExecBuffer == 0) - { - gBattleBufferB[gBattleStruct->expGetterBank][0] = 0; - if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) != 100) - { - gBattleResources_statsBeforeLvlUp->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); - gBattleResources_statsBeforeLvlUp->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); - gBattleResources_statsBeforeLvlUp->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); - gBattleResources_statsBeforeLvlUp->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleResources_statsBeforeLvlUp->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); - gBattleResources_statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF); - - gActiveBattler = gBattleStruct->expGetterBank; - - EmitExpBarUpdate(0, gBattleStruct->expGetterID, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBattler); - } - gBattleStruct->getexpStateTracker++; - } - break; - case 4: // lvl up if necessary - if (gBattleExecBuffer == 0) - { - gActiveBattler = gBattleStruct->expGetterBank; - if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES - && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELLED_UP) - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID) - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattleStruct->expGetterID) - - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL)) - - BattleScriptPushCursor(); - gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterID]; - gBattlescriptCurrInstr = BattleScript_LevelUp; - gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)); - AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterID], FRIENDSHIP_EVENT_GROW_LEVEL); - - // update battle mon structure after level up - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && gBattleMons[0].hp) - { - gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL); - gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP); - gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); - gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); - gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); - // Why is this duplicated? - gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); - gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF); - } - // What is else if? - if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL); - gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP); - gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP); - gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK); - gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF); - // Duplicated again, but this time there's no Sp Defense - gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED); - gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK); - } - } - else - { - gBattleMoveDamage = 0; - } - gBattleStruct->getexpStateTracker = 5; - } - break; - case 5: // looper increment - if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp - gBattleStruct->getexpStateTracker = 3; - else - { - gBattleStruct->expGetterID++; - if (gBattleStruct->expGetterID <= 5) - gBattleStruct->getexpStateTracker = 2; // loop again - else - gBattleStruct->getexpStateTracker = 6; // we're done - } - break; - case 6: // increment instruction - if (gBattleExecBuffer == 0) - { - // not sure why gf clears the item and ability here - gBattleMons[gBank1].item = 0; - gBattleMons[gBank1].ability = 0; - gBattlescriptCurrInstr += 2; - } - break; - } -} - -#ifdef NONMATCHING -static void atk24(void) -{ - u16 HP_count = 0; - int i; - if (gBattleExecBuffer) {return;} - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); - } - - if (HP_count == 0) - gBattleOutcome |= BATTLE_LOST; - - for (HP_count = 0, i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); - } - - if (!HP_count) - gBattleOutcome |= BATTLE_WON; - - if (!gBattleOutcome && (gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - register int found1 asm("r2"); - register int found2 asm("r4"); - - //I can't for the love of god decompile that part - - for (found1 = 0, i = 0; i < gBattlersCount; i += 2) - { - if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) - found1++; - } - - for (found2 = 0, i = 1; i < gBattlersCount; i += 2) - { - if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) - found2++; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (found2 + found1 > 1) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - } - else - { - if (found2 != 0 && found1 != 0) - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - } - } - else - gBattlescriptCurrInstr += 5; - -} -#else -NAKED -static void atk24(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - ldr r0, _08020AF0 @ =gBattleExecBuffer\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _080209C6\n\ - b _08020B46\n\ -_080209C6:\n\ - movs r5, 0\n\ -_080209C8:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08020AF4 @ =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080209F8\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _080209F8\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_080209F8:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _080209C8\n\ - cmp r6, 0\n\ - bne _08020A0C\n\ - ldr r0, _08020AF8 @ =gBattleOutcome\n\ - ldrb r1, [r0]\n\ - movs r2, 0x2\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08020A0C:\n\ - movs r6, 0\n\ - movs r5, 0\n\ -_08020A10:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08020AFC @ =gEnemyParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08020A40\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _08020A40\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_08020A40:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _08020A10\n\ - ldr r2, _08020AF8 @ =gBattleOutcome\n\ - cmp r6, 0\n\ - bne _08020A54\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ -_08020A54:\n\ - ldrb r0, [r2]\n\ - cmp r0, 0\n\ - bne _08020B3E\n\ - ldr r2, _08020B00 @ =gBattleTypeFlags\n\ - ldrh r1, [r2]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - mov r8, r2\n\ - cmp r0, 0\n\ - beq _08020B3E\n\ - movs r2, 0\n\ - movs r5, 0\n\ - ldr r0, _08020B04 @ =gBattlersCount\n\ - ldrb r3, [r0]\n\ - mov r12, r0\n\ - ldr r7, _08020B08 @ =gBattlescriptCurrInstr\n\ - cmp r2, r3\n\ - bge _08020AA0\n\ - ldr r0, _08020B0C @ =gHitMarker\n\ - movs r1, 0x80\n\ - lsls r1, 21\n\ - ldr r6, [r0]\n\ - adds r4, r3, 0\n\ - ldr r3, _08020B10 @ =gSpecialStatuses\n\ -_08020A84:\n\ - adds r0, r1, 0\n\ - lsls r0, r5\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _08020A98\n\ - ldrb r0, [r3]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08020A98\n\ - adds r2, 0x1\n\ -_08020A98:\n\ - adds r3, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r4\n\ - blt _08020A84\n\ -_08020AA0:\n\ - movs r4, 0\n\ - movs r5, 0x1\n\ - mov r0, r12\n\ - ldrb r3, [r0]\n\ - cmp r5, r3\n\ - bge _08020ADA\n\ - ldr r0, _08020B0C @ =gHitMarker\n\ - movs r1, 0x80\n\ - lsls r1, 21\n\ - mov r12, r1\n\ - ldr r1, [r0]\n\ - ldr r0, _08020B10 @ =gSpecialStatuses\n\ - adds r6, r3, 0\n\ - adds r3, r0, 0\n\ - adds r3, 0x14\n\ -_08020ABE:\n\ - mov r0, r12\n\ - lsls r0, r5\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08020AD2\n\ - ldrb r0, [r3]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08020AD2\n\ - adds r4, 0x1\n\ -_08020AD2:\n\ - adds r3, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r6\n\ - blt _08020ABE\n\ -_08020ADA:\n\ - mov r0, r8\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08020B14\n\ - adds r0, r4, r2\n\ - cmp r0, 0x1\n\ - bgt _08020B1C\n\ - b _08020B36\n\ - .align 2, 0\n\ -_08020AF0: .4byte gBattleExecBuffer\n\ -_08020AF4: .4byte gPlayerParty\n\ -_08020AF8: .4byte gBattleOutcome\n\ -_08020AFC: .4byte gEnemyParty\n\ -_08020B00: .4byte gBattleTypeFlags\n\ -_08020B04: .4byte gBattlersCount\n\ -_08020B08: .4byte gBattlescriptCurrInstr\n\ -_08020B0C: .4byte gHitMarker\n\ -_08020B10: .4byte gSpecialStatuses\n\ -_08020B14:\n\ - cmp r4, 0\n\ - beq _08020B36\n\ - cmp r2, 0\n\ - beq _08020B36\n\ -_08020B1C:\n\ - ldr r2, [r7]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - adds r1, r0\n\ - str r1, [r7]\n\ - b _08020B46\n\ -_08020B36:\n\ - ldr r0, [r7]\n\ - adds r0, 0x5\n\ - str r0, [r7]\n\ - b _08020B46\n\ -_08020B3E:\n\ - ldr r1, _08020B50 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ -_08020B46:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08020B50: .4byte gBattlescriptCurrInstr\n\ - .syntax divided\n"); -} -#endif - -static void MoveValuesCleanUp(void) -{ - gMoveResultFlags = 0; - gBattleStruct->dmgMultiplier = 1; - gCritMultiplier = 1; - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattleCommunication[6] = 0; - gHitMarker &= ~(HITMARKER_DESTINYBOND); - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); -} - -static void atk25_movevaluescleanup(void) -{ - MoveValuesCleanUp(); - gBattlescriptCurrInstr += 1; -} - -static void atk26_setmultihit(void) -{ - gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr += 2; -} - -static void atk27_decrementmultihit(void) -{ - if (--gMultiHitCounter == 0) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atk28_goto(void) -{ - gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atk29_jumpifbyte(void) -{ - u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); - u8* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); - u8 value = T2_READ_8(gBattlescriptCurrInstr + 6); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 7); - gBattlescriptCurrInstr += 11; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -static void atk2A_jumpifhalfword(void) -{ - u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); - u16* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); - u16 value = T2_READ_16(gBattlescriptCurrInstr + 6); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 8); - gBattlescriptCurrInstr += 12; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -// Strange that there's an instance of T1_READ_32 in what seems to be a T2 function. see global.h for the distinction. -static void atk2B_jumpifword(void) -{ - u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); - u32* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); - u32 value = T1_READ_32(gBattlescriptCurrInstr + 6); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); - gBattlescriptCurrInstr += 14; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -static void atk2C_jumpifarrayequal(void) -{ - //Mem1, Mem2, Size, Jump Loc - u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); - u32 size = T2_READ_8(gBattlescriptCurrInstr + 9); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); - - u8 i; - for (i = 0; i < size; i++) - { - if (*mem1 != *mem2) - { - gBattlescriptCurrInstr += 14; - break; - } - mem1++, mem2++; - } - - if (i == size) - gBattlescriptCurrInstr = jump_loc; -} - -static void atk2D_jumpifarraynotequal(void) -{ - //Mem1, Mem2, Size, Jump Loc - u8 equal_bytes = 0; - u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); - u32 size = T2_READ_8(gBattlescriptCurrInstr + 9); - u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); - - u8 i; - for (i = 0; i < size; i++) - { - if (*mem1 == *mem2) - { - equal_bytes++; - } - mem1++, mem2++; - } - - if (equal_bytes != size) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 14; -} - -static void atk2E_setbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem = T2_READ_8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk2F_addbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem += T2_READ_8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk30_subbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem -= T2_READ_8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk31_copyarray(void) -{ - u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); - s32 size = T2_READ_8(gBattlescriptCurrInstr + 9); - - s32 i; - for (i = 0; i < size; i++) - { - mem1[i] = mem2[i]; - } - - gBattlescriptCurrInstr += 10; -} - -static void atk32_copyarraywithindex(void) -{ - u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); - u8* index = T2_READ_PTR(gBattlescriptCurrInstr + 9); - s32 size = T2_READ_8(gBattlescriptCurrInstr + 13); - - s32 i; - for (i = 0; i < size; i++) - { - mem1[i] = mem2[i + *index]; - } - - gBattlescriptCurrInstr += 14; -} - -static void atk33_orbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem |= T2_READ_8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk34_orhalfword(void) -{ - u16* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); - - *mem |= val; - gBattlescriptCurrInstr += 7; -} - -static void atk35_orword(void) -{ - u32* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); - - *mem |= val; - gBattlescriptCurrInstr += 9; -} - -static void atk36_bicbyte(void) -{ - u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - *mem &= ~(T2_READ_8(gBattlescriptCurrInstr + 5)); - gBattlescriptCurrInstr += 6; -} - -static void atk37_bichalfword(void) -{ - u16* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); - - *mem &= ~val; - gBattlescriptCurrInstr += 7; -} - -static void atk38_bicword(void) -{ - u32* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); - u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); - - *mem &= ~val; - gBattlescriptCurrInstr += 9; -} - -static void atk39_pause(void) -{ - if (gBattleExecBuffer == 0) - { - u16 value = T2_READ_16(gBattlescriptCurrInstr + 1); - if (++gPauseCounterBattle >= value) - { - gPauseCounterBattle = 0; - gBattlescriptCurrInstr += 3; - } - } -} - -static void atk3A_waitstate(void) -{ - if (gBattleExecBuffer == 0) - gBattlescriptCurrInstr++; -} - -static void atk3B_healthbar_update(void) -{ - if (!T2_READ_8(gBattlescriptCurrInstr + 1)) - gActiveBattler = gBankTarget; - else - gActiveBattler = gBankAttacker; - - EmitHealthBarUpdate(0, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk3C_return(void) -{ - BattleScriptPop(); -} - -static void atk3D_end(void) -{ - gMoveResultFlags = 0; - gActiveBattler = 0; - gCurrentActionFuncId = 0xB; -} - -static void atk3E_end2(void) -{ - //not much difference between this and 3D. It's more apparent in Emerald - gActiveBattler = 0; - gCurrentActionFuncId = 0xB; -} - -static void atk3F_end3(void) //pops the main function stack -{ - BattleScriptPop(); - if (B_FUNCTION_STACK->size) - B_FUNCTION_STACK->size--; - gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; -} - -static void atk41_call(void) -{ - BattleScriptPush(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atk42_jumpiftype2(void) //u8 bank, u8 type, *ptr -{ - u8 bank = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); - - if (T1_READ_8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type1 || T1_READ_8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type2) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else - gBattlescriptCurrInstr += 7; -} - -static void atk43_jumpifabilitypresent(void) -{ - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, T2_READ_8(gBattlescriptCurrInstr + 1), 0, 0)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atk44_endselectionscript(void) -{ - ewram16060(gBankAttacker) = 1; -} - -static void atk45_playanimation(void) -{ - const u16* argumentPtr; - - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3); - - if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE - || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE - || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE) - { - EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 7; - } - else if (gHitMarker & HITMARKER_NO_ANIMATIONS) - { - BattleScriptPush(gBattlescriptCurrInstr + 7); - gBattlescriptCurrInstr = BattleScript_Pausex20; - } - else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES - || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES) - { - EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 7; - } - else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) - { - gBattlescriptCurrInstr += 7; - } - else - { - EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 7; - } -} - -static void atk46_playanimation2(void) // animation Id is stored in the first pointer -{ - const u16* argumentPtr; - const u8* animationIdPtr; - - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - animationIdPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); - argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); - - if (*animationIdPtr == B_ANIM_STATS_CHANGE - || *animationIdPtr == B_ANIM_SNATCH_MOVE - || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) - { - EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 10; - } - else if (gHitMarker & HITMARKER_NO_ANIMATIONS) - { - gBattlescriptCurrInstr += 10; - } - else if (*animationIdPtr == B_ANIM_RAIN_CONTINUES - || *animationIdPtr == B_ANIM_SUN_CONTINUES - || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES - || *animationIdPtr == B_ANIM_HAIL_CONTINUES) - { - EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 10; - } - else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) - { - gBattlescriptCurrInstr += 10; - } - else - { - EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 10; - } -} - -static void atk47_setgraphicalstatchangevalues(void) -{ - u8 to_add = 0; - switch (gBattleStruct->statChanger & 0xF0) - { - case 0x10: //+1 - to_add = 0xF; - break; - case 0x20: //+2 - to_add = 0x27; - break; - case 0x90: //-1 - to_add = 0x16; - break; - case 0xA0: //-2 - to_add = 0x2E; - break; - } - gBattleStruct->animArg1 = (gBattleStruct->statChanger & 0xF) + to_add - 1; - gBattleStruct->animArg2 = 0; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atk48_playstatchangeanimation(void) -{ - int curr_stat = 0; - u16 stat_animID = 0; - int changeable_stats = 0; - u32 stats_to_check; - u8 arg3; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - stats_to_check = T2_READ_8(gBattlescriptCurrInstr + 2); - arg3 = T2_READ_8(gBattlescriptCurrInstr + 3); - if (arg3 & 1) - { - u16 r1 = 0x15; - if (arg3 & 0x2) - r1 = 0x2D; - while (stats_to_check != 0) - { - if (!(stats_to_check & 1)) - continue; - if (!(T2_READ_8(gBattlescriptCurrInstr + 3))) - { - u8 ability; - if (gSideTimers[GetBattlerPosition(gActiveBattler) & 1].mistTimer) - continue; - ability = gBattleMons[gActiveBattler].ability; - if (ability == ABILITY_CLEAR_BODY || ability == ABILITY_WHITE_SMOKE || (ability == ABILITY_KEEN_EYE && curr_stat == 6) || (ability == ABILITY_HYPER_CUTTER && curr_stat == 1)) - continue; - } - if (gBattleMons[gActiveBattler].statStages[curr_stat] > 0) - { - stat_animID = r1; - changeable_stats++; - } - - stats_to_check >>= 1; - r1 += 1; - curr_stat++; - } - if (changeable_stats > 1 && T2_READ_8(gBattlescriptCurrInstr + 3) & 2) - stat_animID = 0x39; - else - stat_animID = 0x3A; - } - else - { - u16 r1 = 0x15; - if (arg3 & 0x2) - r1 = 0x2D; - while (stats_to_check != 0) - { - if (!(stats_to_check & 1)) - continue; - if (gBattleMons[gActiveBattler].statStages[curr_stat] < 0xB) - { - stat_animID = r1; - changeable_stats++; - } - - stats_to_check >>= 1; - r1 += 1; - curr_stat++; - } - if (changeable_stats > 1 && T2_READ_8(gBattlescriptCurrInstr + 3) & 2) - stat_animID = 0x37; - else - stat_animID = 0x38; - } - if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1) - || changeable_stats == 0 || gBattleStruct->filler2[0] != 0) - gBattlescriptCurrInstr += 4; - else - { - EmitBattleAnimation(0, 1, stat_animID); - MarkBufferBankForExecution(gActiveBattler); - if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1) - gBattleStruct->filler2[0] = 1; - gBattlescriptCurrInstr += 4; - } -} - -#else -NAKED -static void atk48_playstatchangeanimation(void) -{ - asm(".syntax unified\n\ -push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - movs r7, 0\n\ - movs r0, 0\n\ - mov r8, r0\n\ - movs r3, 0\n\ - ldr r5, _08021670 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r5]\n\ - ldrb r0, [r0, 0x1]\n\ - str r3, [sp]\n\ - bl GetBattleBank\n\ - ldr r2, _08021674 @ =gActiveBattler\n\ - strb r0, [r2]\n\ - ldr r0, [r5]\n\ - ldrb r4, [r0, 0x2]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - beq _08021710\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x15\n\ - cmp r0, 0\n\ - beq _0802163C\n\ - movs r1, 0x2D\n\ -_0802163C:\n\ - cmp r4, 0\n\ - beq _080216E4\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ - ldr r0, _08021678 @ =gBattleMons+0x18 @ gBattleMons.statStages\n\ - mov r9, r0\n\ - lsls r5, r1, 16\n\ -_0802164A:\n\ - adds r0, r4, 0\n\ - mov r1, r10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080216D6\n\ - ldr r0, _08021670 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802167C\n\ - ldr r0, _08021674 @ =gActiveBattler\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r7, r0\n\ - b _080216C4\n\ - .align 2, 0\n\ -_08021670: .4byte gBattlescriptCurrInstr\n\ -_08021674: .4byte gActiveBattler\n\ -_08021678: .4byte gBattleMons+0x18 @ gBattleMons.statStages\n\ -_0802167C:\n\ - ldr r6, _08021700 @ =gActiveBattler\n\ - ldrb r0, [r6]\n\ - str r3, [sp]\n\ - bl GetBattlerPosition\n\ - mov r1, r10\n\ - ands r1, r0\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _08021704 @ =gSideTimers\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - bne _080216D6\n\ - ldr r0, _08021708 @ =gBattleMons\n\ - ldrb r2, [r6]\n\ - movs r1, 0x58\n\ - muls r2, r1\n\ - adds r0, r2, r0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1D\n\ - beq _080216D6\n\ - cmp r0, 0x49\n\ - beq _080216D6\n\ - cmp r0, 0x33\n\ - bne _080216BA\n\ - cmp r7, 0x6\n\ - beq _080216D6\n\ -_080216BA:\n\ - cmp r0, 0x34\n\ - bne _080216C2\n\ - cmp r7, 0x1\n\ - beq _080216D6\n\ -_080216C2:\n\ - adds r0, r7, r2\n\ -_080216C4:\n\ - add r0, r9\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0\n\ - ble _080216D6\n\ - lsrs r0, r5, 16\n\ - mov r8, r0\n\ - adds r3, 0x1\n\ -_080216D6:\n\ - lsrs r4, 1\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r5, r1\n\ - adds r7, 0x1\n\ - cmp r4, 0\n\ - bne _0802164A\n\ -_080216E4:\n\ - ldr r0, _0802170C @ =gBattlescriptCurrInstr\n\ - mov r9, r0\n\ - cmp r3, 0x1\n\ - ble _08021772\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x39\n\ - mov r8, r1\n\ - cmp r0, 0\n\ - beq _08021772\n\ - movs r0, 0x3A\n\ - b _08021770\n\ - .align 2, 0\n\ -_08021700: .4byte gActiveBattler\n\ -_08021704: .4byte gSideTimers\n\ -_08021708: .4byte gBattleMons\n\ -_0802170C: .4byte gBattlescriptCurrInstr\n\ -_08021710:\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0xE\n\ - cmp r0, 0\n\ - beq _0802171C\n\ - movs r1, 0x26\n\ -_0802171C:\n\ - mov r9, r5\n\ - cmp r4, 0\n\ - beq _08021758\n\ - ldr r6, _0802178C @ =gBattleMons+0x18 @ gBattleMons.statStages\n\ - adds r5, r2, 0\n\ - lsls r2, r1, 16\n\ -_08021728:\n\ - movs r0, 0x1\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _0802174A\n\ - ldrb r1, [r5]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r7, r0\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0xB\n\ - bgt _0802174A\n\ - lsrs r1, r2, 16\n\ - mov r8, r1\n\ - adds r3, 0x1\n\ -_0802174A:\n\ - lsrs r4, 1\n\ - movs r0, 0x80\n\ - lsls r0, 9\n\ - adds r2, r0\n\ - adds r7, 0x1\n\ - cmp r4, 0\n\ - bne _08021728\n\ -_08021758:\n\ - cmp r3, 0x1\n\ - ble _08021772\n\ - mov r1, r9\n\ - ldr r0, [r1]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x37\n\ - mov r8, r1\n\ - cmp r0, 0\n\ - beq _08021772\n\ - movs r0, 0x38\n\ -_08021770:\n\ - mov r8, r0\n\ -_08021772:\n\ - mov r1, r9\n\ - ldr r2, [r1]\n\ - ldrb r1, [r2, 0x3]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021790\n\ - cmp r3, 0x1\n\ - bgt _08021790\n\ - adds r0, r2, 0x4\n\ - mov r1, r9\n\ - b _080217E6\n\ - .align 2, 0\n\ -_0802178C: .4byte gBattleMons+0x18 @ gBattleMons.statStages\n\ -_08021790:\n\ - cmp r3, 0\n\ - beq _080217E0\n\ - ldr r0, _080217D0 @ =gSharedMem\n\ - ldr r1, _080217D4 @ =0x000160dc\n\ - adds r4, r0, r1\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080217E0\n\ - movs r0, 0\n\ - movs r1, 0x1\n\ - mov r2, r8\n\ - str r3, [sp]\n\ - bl EmitBattleAnimation\n\ - ldr r0, _080217D8 @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _080217DC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - beq _080217CC\n\ - cmp r3, 0x1\n\ - ble _080217CC\n\ - movs r0, 0x1\n\ - strb r0, [r4]\n\ -_080217CC:\n\ - ldr r1, _080217DC @ =gBattlescriptCurrInstr\n\ - b _080217E2\n\ - .align 2, 0\n\ -_080217D0: .4byte gSharedMem\n\ -_080217D4: .4byte 0x000160dc\n\ -_080217D8: .4byte gActiveBattler\n\ -_080217DC: .4byte gBattlescriptCurrInstr\n\ -_080217E0:\n\ - mov r1, r9\n\ -_080217E2:\n\ - ldr r0, [r1]\n\ - adds r0, 0x4\n\ -_080217E6:\n\ - str r0, [r1]\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided"); -} - -#endif // NONMATCHING - -#define BattleScript_FlushMessageBox gUnknown_081D9B2D - -extern u8 BattleScript_RageIsBuilding[]; -extern u8 BattleScript_DefrostedViaFireMove[]; -extern u8 BattleScript_FlushMessageBox[]; - -// atk49, moveend cases -#define ATK49_RAGE 0 -#define ATK49_DEFROST 1 -#define ATK49_SYNCHRONIZE_TARGET 2 -#define ATK49_MOVE_END_ABILITIES 3 -#define ATK49_STATUS_IMMUNITY_ABILITIES 4 -#define ATK49_SYNCHRONIZE_ATTACKER 5 -#define ATK49_CHOICE_MOVE 6 -#define ATK49_CHANGED_ITEMS 7 -#define ATK49_ATTACKER_INVISIBLE 8 -#define ATK49_ATTACKER_VISIBLE 9 -#define ATK49_TARGET_VISIBLE 10 -#define ATK49_ITEM_EFFECTS_ALL 11 -#define ATK49_KINGSROCK_SHELLBELL 12 -#define ATK49_SUBSTITUTE 13 -#define ATK49_UPDATE_LAST_MOVES 14 -#define ATK49_MIRROR_MOVE 15 -#define ATK49_NEXT_TARGET 16 -#define ATK49_COUNT 17 - -void atk49_moveend(void) -{ - int i; - bool32 effect = FALSE; - u16 moveType; - u8 holdEffectAtk; - u16 *choicedMoveAtk; - u8 arg1, arg2; - - arg1 = T2_READ_8(gBattlescriptCurrInstr + 1); - arg2 = T2_READ_8(gBattlescriptCurrInstr + 2); - - if (gBattleMons[gBankAttacker].item == ITEM_ENIGMA_BERRY) - holdEffectAtk = gEnigmaBerries[gBankAttacker].holdEffect; - else - holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBankAttacker].item); - - choicedMoveAtk = &((u16*)(gSharedMem + 0x160E8))[gBankAttacker]; - GET_MOVE_TYPE(gCurrentMove, moveType); - - do - { - switch (gBattleStruct->cmd49StateTracker) - { - case ATK49_RAGE: // rage check - if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE - && gBattleMons[gBankTarget].hp != 0 && gBankAttacker != gBankTarget - && GetBattlerSide(gBankAttacker) != GetBattlerSide(gBankTarget) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && (gProtectStructs[gBankTarget].physicalDmg != 0 || gProtectStructs[gBankTarget].specialDmg != 0) - && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB) - { - gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RageIsBuilding; - effect = TRUE; - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_DEFROST: // defrosting check - if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE - && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget - && gSpecialStatuses[gBankTarget].moveturnLostHP_special - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && moveType == TYPE_FIRE) - { - gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE); - gActiveBattler = gBankTarget; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); - MarkBufferBankForExecution(gActiveBattler); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; - effect = TRUE; - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_SYNCHRONIZE_TARGET: // target synchronize - if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0)) - effect = TRUE; - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_MOVE_END_ABILITIES: // Such as abilities activating on contact(Poison Spore, Rough Skin, etc.). - if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBankTarget, 0, 0, 0)) - effect = TRUE; - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_STATUS_IMMUNITY_ABILITIES: //status immunities - if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) - effect = TRUE; //it loops through 4 banks, so we increment after its done with all banks - else - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_SYNCHRONIZE_ATTACKER: //attacker synchronize - if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0)) - effect = TRUE; - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_CHOICE_MOVE: //update choice band move - if (!(gHitMarker & HITMARKER_OBEYS) || holdEffectAtk != HOLD_EFFECT_CHOICE_BAND - || gChosenMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF)) - goto LOOP; - if (gChosenMove == MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_FAILED)) - { - gBattleStruct->cmd49StateTracker++; - break; - } - *choicedMoveAtk = gChosenMove; - LOOP: - { - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == *choicedMoveAtk) - break; - } - if (i == 4) - *choicedMoveAtk = 0; - gBattleStruct->cmd49StateTracker++; - } - break; - case ATK49_CHANGED_ITEMS: // changed held items - for (i = 0; i < gBattlersCount; i++) - { - #define CHANGED_ITEM ((u16 *)(gSharedMem + 0x160F0)) - if (CHANGED_ITEM[i] != 0) - { - gBattleMons[i].item = CHANGED_ITEM[i]; - CHANGED_ITEM[i] = 0; - } - #undef CHANGED_ITEM - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_ATTACKER_INVISIBLE: // make attacker sprite invisible - if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) - effect = TRUE; - else - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_ATTACKER_VISIBLE: // make attacker sprite visible - if (ItemBattleEffects(ITEMEFFECT_KINGSROCK_SHELLBELL, 0, FALSE)) - effect = TRUE; - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_TARGET_VISIBLE: // make target sprite visible - if ((gStatuses3[gBankAttacker] & 0x400C0) && (gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - gActiveBattler = gBankAttacker; - EmitSpriteInvisibility(0, 1); - MarkBufferBankForExecution(gActiveBattler); - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_ITEM_EFFECTS_ALL: // item effects for all battlers - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT - || !(gStatuses3[gBankAttacker] & (STATUS3_SEMI_INVULNERABLE)) - || WasUnableToUseMove(gBankAttacker)) - { - gActiveBattler = gBankAttacker; - EmitSpriteInvisibility(0, FALSE); - MarkBufferBankForExecution(gActiveBattler); - gStatuses3[gBankAttacker] &= ~(STATUS3_SEMI_INVULNERABLE); - gSpecialStatuses[gBankAttacker].restoredBankSprite = 1; - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_KINGSROCK_SHELLBELL: // king's rock and shell bell - if (!gSpecialStatuses[gBankTarget].restoredBankSprite && gBankTarget < gBattlersCount - && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)) - { - gActiveBattler = gBankTarget; - EmitSpriteInvisibility(0, FALSE); - MarkBufferBankForExecution(gActiveBattler); - gStatuses3[gBankTarget] &= ~(STATUS3_SEMI_INVULNERABLE); - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_SUBSTITUTE: // update substitute - for (i = 0; i < gBattlersCount; i++) - { - if (gDisableStructs[i].substituteHP == 0) - gBattleMons[i].status2 &= ~(STATUS2_SUBSTITUTE); - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_UPDATE_LAST_MOVES: - if (gHitMarker & HITMARKER_PURSUIT_TRAP) - { - gActiveBattler = gBankAttacker; - gBankAttacker = gBankTarget; - gBankTarget = gActiveBattler; - gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); - } - - if (gBattleMoves[gChosenMove].effect != 0x7F || (gMoveResultFlags & 0x29)) - gUnknown_02024C2C[gBankAttacker] = gChosenMove; - - if (!(gAbsentBattlerFlags & gBitTable[gBankAttacker]) - && !(gSharedMem[0x160A6] & gBitTable[gBankAttacker]) - && gBattleMoves[gChosenMove].effect != EFFECT_BATON_PASS) - { - if (gHitMarker & HITMARKER_OBEYS) - { - gLastUsedMove[gBankAttacker] = gChosenMove; - gUnknown_02024C4C[gBankAttacker] = gCurrentMove; - } - else - { - gLastUsedMove[gBankAttacker] = 0xFFFF; - gUnknown_02024C4C[gBankAttacker] = 0xFFFF; - } - - if (!(gHitMarker & HITMARKER_FAINTED(gBankTarget))) - gLastHitBy[gBankTarget] = gBankAttacker; - - if (gHitMarker & HITMARKER_OBEYS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (gChosenMove == 0xFFFF) - { - gLastLandedMoves[gBankTarget] = gChosenMove; - } - else - { - gLastLandedMoves[gBankTarget] = gCurrentMove; - GET_MOVE_TYPE(gCurrentMove, gLastHitByType[gBankTarget]); - } - } - else - { - gLastLandedMoves[gBankTarget] = 0xFFFF; - } - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_MIRROR_MOVE: - if (!(gAbsentBattlerFlags & gBitTable[gBankAttacker]) && !(gSharedMem[0x160A6] & gBitTable[gBankAttacker])) - { - if (gBattleMoves[gChosenMove].flags & 0x10 && gHitMarker & HITMARKER_OBEYS - && gBankAttacker != gBankTarget && !(gHitMarker & HITMARKER_FAINTED(gBankTarget)) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gSharedMem[0x160AC + gBankTarget * 2 + 0] = gChosenMove; - gSharedMem[0x160AC + gBankTarget * 2 + 1] = gChosenMove >> 8; - - gSharedMem[0x16100 + gBankTarget * 4 + 0 + (gBankAttacker / 2) * 2] = gChosenMove; - gSharedMem[0x16100 + gBankTarget * 4 + 1 + (gBankAttacker / 2) * 2] = gChosenMove >> 8; - } - else if (gBankAttacker != gBankTarget) - { - gSharedMem[0x160AC + gBankTarget * 2 + 0] = 0; - gSharedMem[0x160AC + gBankTarget * 2 + 1] = 0; - - gSharedMem[0x16100 + gBankTarget * 4 + 0 + (gBankAttacker / 2) * 2] = 0; - gSharedMem[0x16100 + gBankTarget * 4 + 1 + (gBankAttacker / 2) * 2] = 0; - } - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_NEXT_TARGET: - if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !gProtectStructs[gBankAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH - && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) - { - u8 battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBankTarget))); - if (gBattleMons[battlerId].hp != 0) - { - gBankTarget = battlerId; - gHitMarker |= HITMARKER_NO_ATTACKSTRING; - gBattleStruct->cmd49StateTracker = 0; - MoveValuesCleanUp(); - BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattlescriptCurrInstr = BattleScript_FlushMessageBox; - return; - } - else - { - gHitMarker |= HITMARKER_NO_ATTACKSTRING; - } - } - gBattleStruct->cmd49StateTracker++; - break; - case ATK49_COUNT: - break; - } - - if (arg1 == 1 && effect == FALSE) - gBattleStruct->cmd49StateTracker = ATK49_COUNT; - if (arg1 == 2 && arg2 == gBattleStruct->cmd49StateTracker) - gBattleStruct->cmd49StateTracker = ATK49_COUNT; - - } while (gBattleStruct->cmd49StateTracker != ATK49_COUNT && effect == FALSE); - - if (gBattleStruct->cmd49StateTracker == ATK49_COUNT && effect == FALSE) - gBattlescriptCurrInstr += 3; -} - -static void atk4A_typecalc2(void) -{ - u8 flags = 0; - int i = 0; - u8 move_type = gBattleMoves[gCurrentMove].type; - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - gLastLandedMoves[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) {break;} - else {i += 3; continue;} - } - - if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - { - if (gTypeEffectiveness[i + 2] == 0) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (gTypeEffectiveness[i + 2] == 5) - flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - if (gTypeEffectiveness[i + 2] == 20) - flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2) - { - if (gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 0) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 5) - flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 20) - flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - } - i += 3; - } - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_NO_EFFECT) && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 && - (!(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) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - gProtectStructs[gBankAttacker].notEffective = 1; - - gBattlescriptCurrInstr++; -} - -static void atk4B_returnatktoball(void) -{ - gActiveBattler = gBankAttacker; - if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler))) - { - EmitReturnPokeToBall(0, 0); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr++; -} - -static void atk4C_getswitchedmondata(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - - gBattlerPartyIndexes[gActiveBattler] = ewram16068arr(gActiveBattler); - - EmitGetAttributes(0, 0, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk4D_switchindataupdate(void) -{ - struct BattlePokemon oldData; - s32 i; - u8 *monData; - - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(gBattlescriptCurrInstr[1]); - oldData = gBattleMons[gActiveBattler]; - monData = (u8*)(&gBattleMons[gActiveBattler]); - - for (i = 0; i < sizeof(struct BattlePokemon); i++) - { - monData[i] = gBattleBufferB[gActiveBattler][4 + i]; - } - - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].altAbility); - - // check knocked off item - i = GetBattlerSide(gActiveBattler); - if (gWishFutureKnock.knockedOffPokes[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]]) - { - gBattleMons[gActiveBattler].item = 0; - } - - if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { - for (i = 0; i < 8; i++) - { - gBattleMons[gActiveBattler].statStages[i] = oldData.statStages[i]; - } - gBattleMons[gActiveBattler].status2 = oldData.status2; - } - - SwitchInClearSetData(); - - gBattleStruct->scriptingActive = gActiveBattler; - - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]); - - gBattlescriptCurrInstr += 2; -} - -static void atk4E_switchinanim(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (GetBattlerSide(gActiveBattler) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER))) - { - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), 2); - } - gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]); - EmitSendOutPoke(0, gBattlerPartyIndexes[gActiveBattler], T2_READ_8(gBattlescriptCurrInstr + 2)); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 3; -} - -static void atk4F_jumpifcantswitch(void) -{ - int val, to_cmp; - register struct Pokemon *party; - u8 r7; - //0x80 byte is used as a way of telling the function whether to not check status2/status3 - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1) & 0x7F); - if (!(T2_READ_8(gBattlescriptCurrInstr + 1) & 0x80) - && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - return; - } - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBattlerSide(gActiveBattler) == 1) - party = gEnemyParty; - else - party = gPlayerParty; - val = 0; - if (sub_803FBFC(sub_803FC34(gActiveBattler)) == 1) - val = 3; - for (to_cmp = val + 3; val < to_cmp; val++) - { - if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[val], MON_DATA_IS_EGG) - && GetMonData(&party[val], MON_DATA_HP) != 0 - && gBattlerPartyIndexes[gActiveBattler] != val) - break; - } - if (val == to_cmp) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - } - else - { - if (GetBattlerSide(gActiveBattler) == 1) - { - r7 = GetBattlerAtPosition(1); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBattlerAtPosition(3); - else - to_cmp = r7; - party = gEnemyParty; - } - else - { - r7 = GetBattlerAtPosition(0); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBattlerAtPosition(2); - else - to_cmp = r7; - party = gPlayerParty; - } - for (val = 0; val < 6; val++) - { - if (GetMonData(&party[val], MON_DATA_HP) != 0 - && GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[val], MON_DATA_IS_EGG) - && val != gBattlerPartyIndexes[r7] && val != gBattlerPartyIndexes[to_cmp]) - break; - } - if (val == 6) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - } -} - -void sub_8022A3C(u8 unkown) -{ - BATTLE_PARTY_ID(gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; - EmitChoosePokemon(0, 1, unkown, 0, gBattleStruct->unk1606C[gActiveBattler]); - MarkBufferBankForExecution(gActiveBattler); -} - -/* -static void atk50_openpartyscreen(void) -{ - int i = 0; - int r9 = 0; - u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2); - - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 5) - { - if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) - { - for (gActiveBattler = i; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler))) - { - EmitLinkStandbyMsg(0, 2); - MarkBufferBankForExecution(gActiveBattler); - } - else if (sub_8018018(gActiveBattler, 6, 6) == 0 - && !gSpecialStatuses[gActiveBattler].flag40) - { - sub_8022A3C(6); - gSpecialStatuses[gActiveBattler].flag40 = 1; - } - else - { - gAbsentBattlerFlags |= gBitTable[gActiveBattler]; - gHitMarker &= (~HITMARKER_FAINTED(gActiveBattler)); - EmitLinkStandbyMsg(0, 2); - MarkBufferBankForExecution(gActiveBattler); - } - } - } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (!(gHitMarker >> 0x1C & gBitTable[0])) - { - - } - else if (sub_8018018(gActiveBattler, 6, 6) == 0 - && !gSpecialStatuses[gActiveBattler].flag40) - { - - } - else - { - - } - } - } -} -*/ - -NAKED -static void atk50_openpartyscreen(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - movs r7, 0\n\ - movs r0, 0\n\ - mov r9, r0\n\ - ldr r6, _08022B44 @ =gBattlescriptCurrInstr\n\ - ldr r1, [r6]\n\ - ldrb r2, [r1, 0x2]\n\ - ldrb r0, [r1, 0x3]\n\ - lsls r0, 8\n\ - orrs r2, r0\n\ - ldrb r0, [r1, 0x4]\n\ - lsls r0, 16\n\ - orrs r2, r0\n\ - ldrb r0, [r1, 0x5]\n\ - lsls r0, 24\n\ - orrs r2, r0\n\ - mov r8, r2\n\ - ldrb r2, [r1, 0x1]\n\ - adds r0, r2, 0\n\ - mov r12, r6\n\ - cmp r0, 0x5\n\ - beq _08022ACE\n\ - b _08022F74\n\ -_08022ACE:\n\ - ldr r0, _08022B48 @ =gBattleTypeFlags\n\ - ldrh r0, [r0]\n\ - movs r1, 0x41\n\ - ands r1, r0\n\ - cmp r1, 0x1\n\ - beq _08022BBC\n\ - ldr r1, _08022B4C @ =gActiveBattler\n\ - strb r7, [r1]\n\ - ldr r0, _08022B50 @ =gBattlersCount\n\ - ldrb r0, [r0]\n\ - cmp r7, r0\n\ - bcc _08022AE8\n\ - b _08022F62\n\ -_08022AE8:\n\ - ldr r7, _08022B54 @ =gHitMarker\n\ - ldr r6, _08022B58 @ =gBitTable\n\ - adds r4, r1, 0\n\ - ldr r0, _08022B5C @ =gAbsentBattlerFlags\n\ - mov r8, r0\n\ -_08022AF2:\n\ - ldrb r2, [r4]\n\ - lsls r0, r2, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08022B94\n\ - adds r0, r2, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022B60\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - bics r0, r1\n\ - str r0, [r7]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022BA2\n\ - .align 2, 0\n\ -_08022B44: .4byte gBattlescriptCurrInstr\n\ -_08022B48: .4byte gBattleTypeFlags\n\ -_08022B4C: .4byte gActiveBattler\n\ -_08022B50: .4byte gBattlersCount\n\ -_08022B54: .4byte gHitMarker\n\ -_08022B58: .4byte gBitTable\n\ -_08022B5C: .4byte gAbsentBattlerFlags\n\ -_08022B60:\n\ - ldr r5, _08022B90 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022BA2\n\ - movs r0, 0x6\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022BA2\n\ - .align 2, 0\n\ -_08022B90: .4byte gSpecialStatuses\n\ -_08022B94:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022BA2:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - ldr r1, _08022BB8 @ =gBattlersCount\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08022AF2\n\ - b _08022F62\n\ - .align 2, 0\n\ -_08022BB8: .4byte gBattlersCount\n\ -_08022BBC:\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08022BC4\n\ - b _08022F62\n\ -_08022BC4:\n\ - ldr r0, _08022C1C @ =gHitMarker\n\ - mov r8, r0\n\ - ldr r0, [r0]\n\ - lsrs r5, r0, 28\n\ - ldr r6, _08022C20 @ =gBitTable\n\ - ldr r0, [r6]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022C7E\n\ - ldr r4, _08022C24 @ =gActiveBattler\n\ - strb r7, [r4]\n\ - movs r0, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022C2C\n\ - ldr r2, _08022C28 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - mov r2, r8\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022C7E\n\ - .align 2, 0\n\ -_08022C1C: .4byte gHitMarker\n\ -_08022C20: .4byte gBitTable\n\ -_08022C24: .4byte gActiveBattler\n\ -_08022C28: .4byte gAbsentBattlerFlags\n\ -_08022C2C:\n\ - ldr r6, _08022C60 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022C6C\n\ - ldr r0, _08022C64 @ =gSharedMem\n\ - ldr r1, _08022C68 @ =0x0001606a\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022C7E\n\ - .align 2, 0\n\ -_08022C60: .4byte gSpecialStatuses\n\ -_08022C64: .4byte gSharedMem\n\ -_08022C68: .4byte 0x0001606a\n\ -_08022C6C:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - movs r2, 0x1\n\ - mov r9, r2\n\ -_08022C7E:\n\ - ldr r6, _08022CD8 @ =gBitTable\n\ - ldr r0, [r6, 0x8]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022D40\n\ - ldr r0, [r6]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _08022D40\n\ - ldr r4, _08022CDC @ =gActiveBattler\n\ - movs r0, 0x2\n\ - strb r0, [r4]\n\ - movs r0, 0x2\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022CE8\n\ - ldr r2, _08022CE0 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022CE4 @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022D40\n\ - .align 2, 0\n\ -_08022CD8: .4byte gBitTable\n\ -_08022CDC: .4byte gActiveBattler\n\ -_08022CE0: .4byte gAbsentBattlerFlags\n\ -_08022CE4: .4byte gHitMarker\n\ -_08022CE8:\n\ - ldr r6, _08022D1C @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022D28\n\ - ldr r0, _08022D20 @ =gSharedMem\n\ - ldr r1, _08022D24 @ =0x00016068\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022D40\n\ - .align 2, 0\n\ -_08022D1C: .4byte gSpecialStatuses\n\ -_08022D20: .4byte gSharedMem\n\ -_08022D24: .4byte 0x00016068\n\ -_08022D28:\n\ - movs r0, 0x1\n\ - mov r2, r9\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08022D40\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022D40:\n\ - ldr r6, _08022D90 @ =gBitTable\n\ - ldr r0, [r6, 0x4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022DF6\n\ - ldr r4, _08022D94 @ =gActiveBattler\n\ - movs r0, 0x1\n\ - strb r0, [r4]\n\ - movs r0, 0x1\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022DA0\n\ - ldr r2, _08022D98 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022D9C @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022DF6\n\ - .align 2, 0\n\ -_08022D90: .4byte gBitTable\n\ -_08022D94: .4byte gActiveBattler\n\ -_08022D98: .4byte gAbsentBattlerFlags\n\ -_08022D9C: .4byte gHitMarker\n\ -_08022DA0:\n\ - ldr r6, _08022DD4 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022DE0\n\ - ldr r0, _08022DD8 @ =gSharedMem\n\ - ldr r1, _08022DDC @ =0x0001606b\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022DF6\n\ - .align 2, 0\n\ -_08022DD4: .4byte gSpecialStatuses\n\ -_08022DD8: .4byte gSharedMem\n\ -_08022DDC: .4byte 0x0001606b\n\ -_08022DE0:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - movs r0, 0x2\n\ - mov r2, r9\n\ - orrs r2, r0\n\ - mov r9, r2\n\ -_08022DF6:\n\ - ldr r6, _08022E50 @ =gBitTable\n\ - ldr r0, [r6, 0xC]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022EB8\n\ - ldr r0, [r6, 0x4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _08022EB8\n\ - ldr r4, _08022E54 @ =gActiveBattler\n\ - movs r0, 0x3\n\ - strb r0, [r4]\n\ - movs r0, 0x3\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022E60\n\ - ldr r2, _08022E58 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022E5C @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022EB8\n\ - .align 2, 0\n\ -_08022E50: .4byte gBitTable\n\ -_08022E54: .4byte gActiveBattler\n\ -_08022E58: .4byte gAbsentBattlerFlags\n\ -_08022E5C: .4byte gHitMarker\n\ -_08022E60:\n\ - ldr r6, _08022E94 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022EA0\n\ - ldr r0, _08022E98 @ =gSharedMem\n\ - ldr r1, _08022E9C @ =0x00016069\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022EB8\n\ - .align 2, 0\n\ -_08022E94: .4byte gSpecialStatuses\n\ -_08022E98: .4byte gSharedMem\n\ -_08022E9C: .4byte 0x00016069\n\ -_08022EA0:\n\ - movs r0, 0x2\n\ - mov r2, r9\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - bne _08022EB8\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022EB8:\n\ - ldr r1, _08022EE8 @ =gSpecialStatuses\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F0C\n\ - adds r0, r1, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F0C\n\ - cmp r5, 0\n\ - beq _08022F0C\n\ - ldr r0, _08022EEC @ =gAbsentBattlerFlags\n\ - ldrb r1, [r0]\n\ - ldr r0, _08022EF0 @ =gBitTable\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _08022EF8\n\ - ldr r1, _08022EF4 @ =gActiveBattler\n\ - movs r0, 0x2\n\ - strb r0, [r1]\n\ - b _08022EFC\n\ - .align 2, 0\n\ -_08022EE8: .4byte gSpecialStatuses\n\ -_08022EEC: .4byte gAbsentBattlerFlags\n\ -_08022EF0: .4byte gBitTable\n\ -_08022EF4: .4byte gActiveBattler\n\ -_08022EF8:\n\ - ldr r0, _08022F3C @ =gActiveBattler\n\ - strb r1, [r0]\n\ -_08022EFC:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldr r0, _08022F3C @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ -_08022F0C:\n\ - ldr r1, _08022F40 @ =gSpecialStatuses\n\ - ldrb r0, [r1, 0x14]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F62\n\ - adds r0, r1, 0\n\ - adds r0, 0x3C\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F62\n\ - cmp r5, 0\n\ - beq _08022F62\n\ - ldr r0, _08022F44 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r0]\n\ - ldr r1, _08022F48 @ =gBitTable\n\ - ldr r1, [r1, 0x4]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08022F4C\n\ - ldr r1, _08022F3C @ =gActiveBattler\n\ - movs r0, 0x3\n\ - b _08022F50\n\ - .align 2, 0\n\ -_08022F3C: .4byte gActiveBattler\n\ -_08022F40: .4byte gSpecialStatuses\n\ -_08022F44: .4byte gAbsentBattlerFlags\n\ -_08022F48: .4byte gBitTable\n\ -_08022F4C:\n\ - ldr r1, _08022F6C @ =gActiveBattler\n\ - movs r0, 0x1\n\ -_08022F50:\n\ - strb r0, [r1]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldr r0, _08022F6C @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ -_08022F62:\n\ - ldr r1, _08022F70 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x6\n\ - str r0, [r1]\n\ - b _08023302\n\ - .align 2, 0\n\ -_08022F6C: .4byte gActiveBattler\n\ -_08022F70: .4byte gBattlescriptCurrInstr\n\ -_08022F74:\n\ - cmp r0, 0x6\n\ - beq _08022F7A\n\ - b _08023170\n\ -_08022F7A:\n\ - ldr r0, _08022FF0 @ =gBattleTypeFlags\n\ - ldrh r2, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08022F88\n\ - b _0802310C\n\ -_08022F88:\n\ - movs r0, 0x1\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08022F92\n\ - b _0802310C\n\ -_08022F92:\n\ - ldr r7, _08022FF4 @ =gHitMarker\n\ - ldr r0, [r7]\n\ - lsrs r5, r0, 28\n\ - ldr r4, _08022FF8 @ =gBitTable\n\ - ldr r0, [r4, 0x8]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _0802303A\n\ - ldr r0, [r4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _0802303A\n\ - ldr r6, _08022FFC @ =gActiveBattler\n\ - movs r0, 0x2\n\ - strb r0, [r6]\n\ - ldr r0, _08023000 @ =gBattleBufferB\n\ - ldrb r1, [r0, 0x1]\n\ - movs r0, 0x2\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08023008\n\ - ldr r2, _08023004 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - bics r0, r1\n\ - str r0, [r7]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r6]\n\ - bl MarkBufferBankForExecution\n\ - b _0802303A\n\ - .align 2, 0\n\ -_08022FF0: .4byte gBattleTypeFlags\n\ -_08022FF4: .4byte gHitMarker\n\ -_08022FF8: .4byte gBitTable\n\ -_08022FFC: .4byte gActiveBattler\n\ -_08023000: .4byte gBattleBufferB\n\ -_08023004: .4byte gAbsentBattlerFlags\n\ -_08023008:\n\ - ldr r4, _08023098 @ =gSpecialStatuses\n\ - ldrb r0, [r6]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _0802303A\n\ - ldr r0, _0802309C @ =gSharedMem\n\ - ldr r1, _080230A0 @ =0x00016068\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r6]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_0802303A:\n\ - ldr r4, _080230A4 @ =gBitTable\n\ - ldr r0, [r4, 0xC]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _080230EE\n\ - ldr r0, [r4, 0x4]\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - beq _080230EE\n\ - ldr r5, _080230A8 @ =gActiveBattler\n\ - movs r0, 0x3\n\ - strb r0, [r5]\n\ - ldr r0, _080230AC @ =gBattleBufferB\n\ - ldr r2, _080230B0 @ =0x00000201\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r0, 0x3\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080230BC\n\ - ldr r2, _080230B4 @ =gAbsentBattlerFlags\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _080230B8 @ =gHitMarker\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl Emitcmd42\n\ - ldrb r0, [r5]\n\ - bl MarkBufferBankForExecution\n\ - b _080230EE\n\ - .align 2, 0\n\ -_08023098: .4byte gSpecialStatuses\n\ -_0802309C: .4byte gSharedMem\n\ -_080230A0: .4byte 0x00016068\n\ -_080230A4: .4byte gBitTable\n\ -_080230A8: .4byte gActiveBattler\n\ -_080230AC: .4byte gBattleBufferB\n\ -_080230B0: .4byte 0x00000201\n\ -_080230B4: .4byte gAbsentBattlerFlags\n\ -_080230B8: .4byte gHitMarker\n\ -_080230BC:\n\ - ldr r4, _080230FC @ =gSpecialStatuses\n\ - ldrb r0, [r5]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _080230EE\n\ - ldr r0, _08023100 @ =gSharedMem\n\ - ldr r1, _08023104 @ =0x00016069\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r5]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_080230EE:\n\ - ldr r1, _08023108 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x6\n\ - str r0, [r1]\n\ - mov r12, r1\n\ - b _08023110\n\ - .align 2, 0\n\ -_080230FC: .4byte gSpecialStatuses\n\ -_08023100: .4byte gSharedMem\n\ -_08023104: .4byte 0x00016069\n\ -_08023108: .4byte gBattlescriptCurrInstr\n\ -_0802310C:\n\ - adds r0, r1, 0x6\n\ - str r0, [r6]\n\ -_08023110:\n\ - ldr r0, _08023160 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - lsrs r5, r0, 28\n\ - ldr r1, _08023164 @ =gBank1\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - ldr r4, _08023168 @ =gBitTable\n\ - ldr r2, [r4]\n\ - ands r2, r5\n\ - ldr r6, _0802316C @ =gBattlersCount\n\ - cmp r2, 0\n\ - bne _0802314C\n\ - adds r7, r6, 0\n\ - ldrb r0, [r6]\n\ - cmp r2, r0\n\ - bcs _0802314C\n\ - adds r3, r1, 0\n\ -_08023132:\n\ - ldrb r0, [r3]\n\ - adds r0, 0x1\n\ - strb r0, [r3]\n\ - ldrb r2, [r3]\n\ - lsls r0, r2, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _0802314C\n\ - ldrb r0, [r7]\n\ - cmp r2, r0\n\ - bcc _08023132\n\ -_0802314C:\n\ - ldrb r0, [r1]\n\ - ldrb r6, [r6]\n\ - cmp r0, r6\n\ - beq _08023156\n\ - b _08023302\n\ -_08023156:\n\ - mov r1, r8\n\ - mov r2, r12\n\ - str r1, [r2]\n\ - b _08023302\n\ - .align 2, 0\n\ -_08023160: .4byte gHitMarker\n\ -_08023164: .4byte gBank1\n\ -_08023168: .4byte gBitTable\n\ -_0802316C: .4byte gBattlersCount\n\ -_08023170:\n\ - movs r0, 0x80\n\ - ands r0, r2\n\ - movs r5, 0x1\n\ - cmp r0, 0\n\ - beq _0802317C\n\ - movs r5, 0\n\ -_0802317C:\n\ - movs r0, 0x7F\n\ - ands r0, r2\n\ - bl GetBattleBank\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r1, _080231A4 @ =gSpecialStatuses\n\ - lsls r0, r7, 2\n\ - adds r0, r7\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - bge _080231A8\n\ - ldr r0, [r6]\n\ - adds r0, 0x6\n\ - str r0, [r6]\n\ - b _08023302\n\ - .align 2, 0\n\ -_080231A4: .4byte gSpecialStatuses\n\ -_080231A8:\n\ - adds r0, r7, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080231F8\n\ - ldr r2, _080231E8 @ =gActiveBattler\n\ - strb r7, [r2]\n\ - ldr r3, _080231EC @ =gAbsentBattlerFlags\n\ - ldr r4, _080231F0 @ =gBitTable\n\ - ldrb r0, [r2]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r3]\n\ - orrs r0, r1\n\ - strb r0, [r3]\n\ - ldr r3, _080231F4 @ =gHitMarker\n\ - ldrb r0, [r2]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r3]\n\ - bics r0, r1\n\ - str r0, [r3]\n\ - mov r0, r8\n\ - str r0, [r6]\n\ - b _08023302\n\ - .align 2, 0\n\ -_080231E8: .4byte gActiveBattler\n\ -_080231EC: .4byte gAbsentBattlerFlags\n\ -_080231F0: .4byte gBitTable\n\ -_080231F4: .4byte gHitMarker\n\ -_080231F8:\n\ - ldr r4, _080232A0 @ =gActiveBattler\n\ - strb r7, [r4]\n\ - ldr r3, _080232A4 @ =gSharedMem\n\ - ldrb r0, [r4]\n\ - ldr r2, _080232A8 @ =0x00016064\n\ - adds r1, r0, r2\n\ - adds r1, r3\n\ - ldr r2, _080232AC @ =gBattlerPartyIndexes\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r1, [r4]\n\ - movs r0, 0x2\n\ - eors r0, r1\n\ - ldr r1, _080232B0 @ =0x00016068\n\ - adds r0, r1\n\ - adds r0, r3\n\ - ldrb r2, [r0]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - ldr r1, _080232B4 @ =0x0001606c\n\ - adds r3, r1\n\ - adds r0, r3\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - adds r1, r5, 0\n\ - movs r3, 0\n\ - bl EmitChoosePokemon\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, [r6]\n\ - adds r0, 0x6\n\ - str r0, [r6]\n\ - ldrb r0, [r4]\n\ - bl GetBattlerPosition\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0802325A\n\ - ldr r1, _080232B8 @ =gBattleResults\n\ - ldrb r0, [r1, 0x2]\n\ - cmp r0, 0xFE\n\ - bhi _0802325A\n\ - adds r0, 0x1\n\ - strb r0, [r1, 0x2]\n\ -_0802325A:\n\ - ldr r0, _080232BC @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080232C4\n\ - ldr r1, _080232A0 @ =gActiveBattler\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - ldr r0, _080232C0 @ =gBattlersCount\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _08023302\n\ - adds r4, r1, 0\n\ -_08023276:\n\ - ldrb r0, [r4]\n\ - cmp r0, r7\n\ - beq _0802328A\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_0802328A:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - ldr r1, _080232C0 @ =gBattlersCount\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08023276\n\ - b _08023302\n\ - .align 2, 0\n\ -_080232A0: .4byte gActiveBattler\n\ -_080232A4: .4byte gSharedMem\n\ -_080232A8: .4byte 0x00016064\n\ -_080232AC: .4byte gBattlerPartyIndexes\n\ -_080232B0: .4byte 0x00016068\n\ -_080232B4: .4byte 0x0001606c\n\ -_080232B8: .4byte gBattleResults\n\ -_080232BC: .4byte gBattleTypeFlags\n\ -_080232C0: .4byte gBattlersCount\n\ -_080232C4:\n\ - adds r0, r7, 0\n\ - bl GetBattlerPosition\n\ - movs r1, 0x1\n\ - eors r0, r1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBattlerAtPosition\n\ - ldr r4, _08023310 @ =gActiveBattler\n\ - strb r0, [r4]\n\ - ldr r0, _08023314 @ =gAbsentBattlerFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, _08023318 @ =gBitTable\n\ - ldrb r3, [r4]\n\ - lsls r0, r3, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080232F4\n\ - movs r0, 0x2\n\ - eors r3, r0\n\ - strb r3, [r4]\n\ -_080232F4:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08023302:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08023310: .4byte gActiveBattler\n\ -_08023314: .4byte gAbsentBattlerFlags\n\ -_08023318: .4byte gBitTable\n\ - .syntax divided"); -} - -static void atk51_switchhandleorder(void) -{ - int i; - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - switch (T2_READ_8(gBattlescriptCurrInstr + 2)) - { - case 0: - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleBufferB[i][0] == 0x22) - ewram16068arr(i) = gBattleBufferB[i][1]; - } - break; - case 1: - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - sub_8012258(gActiveBattler); - break; - case 2: - gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1]; - ewram16068arr(gActiveBattler) = gBattleBufferB[gActiveBattler][1]; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - ewram1606Carr(0, gActiveBattler) &= 0xF; - ewram1606Carr(0, gActiveBattler) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); - ewram1606Carr(1, gActiveBattler) = gBattleBufferB[gActiveBattler][3]; - ewram1606Carr(0, (gActiveBattler ^ 2)) &= (0xF0); - ewram1606Carr(0, (gActiveBattler ^ 2)) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; - ewram1606Carr(2, (gActiveBattler ^ 2)) = gBattleBufferB[gActiveBattler][3]; - } - else - sub_8012258(gActiveBattler); - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 6; - gBattleTextBuff1[2] = gBattleMons[gBankAttacker].species; - gBattleTextBuff1[3] = gBattleMons[gBankAttacker].species >> 8; - gBattleTextBuff1[4] = 0xFF; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 7; - gBattleTextBuff2[2] = gActiveBattler; - gBattleTextBuff2[3] = gBattleBufferB[gActiveBattler][1]; - gBattleTextBuff2[4] = 0xFF; - break; - } - gBattlescriptCurrInstr += 3; -} - -static void atk52_switchineffects(void) -{ - int i; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - sub_80157C4(gActiveBattler); - gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - gSpecialStatuses[gActiveBattler].flag40 = 0; - - if (!(gSideAffecting[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED) && (gSideAffecting[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES) - && gBattleMons[gActiveBattler].type1 != TYPE_FLYING && gBattleMons[gActiveBattler].type2 != TYPE_FLYING && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) - { - u8 spikesDmg; - - gSideAffecting[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED; - - spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2; - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (spikesDmg); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - gBattleStruct->scriptingActive = gActiveBattler; - BattleScriptPushCursor(); - - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) - gBattlescriptCurrInstr = BattleScript_SpikesOnTarget; - else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1) - gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker; - else - gBattlescriptCurrInstr = BattleScript_SpikesOngBank1; - } - else - { - if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT) - { - gDisableStructs[gActiveBattler].truantCounter = 1; - } - - if (AbilityBattleEffects(0, gActiveBattler, 0, 0, 0) == 0 && ItemBattleEffects(0, gActiveBattler, 0) == 0) - { - gSideAffecting[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED); - - for (i = 0; i < gBattlersCount; i++) - { - if (gBanksByTurnOrder[i] == gActiveBattler) - gActionsByTurnOrder[i] = 0xC; - } - - for (i = 0; i < gBattlersCount; i++) - { - *(HP_ON_SWITCHOUT + GetBattlerSide(i)) = gBattleMons[i].hp; - } - - if (T2_READ_8(gBattlescriptCurrInstr + 1) == 5) - { - u32 hitmark = gHitMarker >> 0x1C; - gBank1++; - while (1) - { - if (hitmark & gBitTable[gBank1] && !(gAbsentBattlerFlags & gBitTable[gBank1])) - break; - if (gBank1 >= gBattlersCount) - break; - gBank1++; - } - } - gBattlescriptCurrInstr += 2; - } - } -} - -static void atk53_trainerslidein(void) -{ - if (!T2_READ_8(gBattlescriptCurrInstr + 1)) - gActiveBattler = GetBattlerAtPosition(0); - else - gActiveBattler = GetBattlerAtPosition(1); - - EmitTrainerSlide(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk54_playse(void) -{ - gActiveBattler = gBankAttacker; - EmitEffectivenessSound(0, T2_READ_16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 3; -} - -static void atk55_fanfare(void) -{ - gActiveBattler = gBankAttacker; - Emitcmd44(0, T2_READ_16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 3; -} - -static void atk56_playfaintcry(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - EmitFaintingCry(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk57(void) -{ - gActiveBattler = GetBattlerAtPosition(0); - Emitcmd55(0, gBattleOutcome); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 1; -} - -static void atk58_returntoball(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - EmitReturnPokeToBall(0, 1); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -void atk59_handlelearnnewmove(void) -{ - u8* loc1 = T1_READ_PTR(gBattlescriptCurrInstr + 1); - u8* loc2 = T1_READ_PTR(gBattlescriptCurrInstr + 5); - - u16 ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterID], T2_READ_8(gBattlescriptCurrInstr + 9)); - while (ret == 0xFFFE) - ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterID], 0); - - if (ret == 0) - { - gBattlescriptCurrInstr = loc2; - } - else if (ret == 0xFFFF) - { - gBattlescriptCurrInstr += 10; - } - else - { - gActiveBattler = GetBattlerAtPosition(0); - if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) - GiveMoveToBattleMon(&gBattleMons[gActiveBattler], ret); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) //what is else if - { - gActiveBattler = GetBattlerAtPosition(2); - if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) - GiveMoveToBattleMon(&gBattleMons[gActiveBattler], ret); - } - gBattlescriptCurrInstr = loc1; - } -} - -void sub_8023A80(void) -{ - sub_802BBD4(0x18, 8, 0x1D, 0xD, 0); - Text_InitWindow(&gUnknown_03004210, BattleText_YesNo, 0x100, 0x19, 0x9); - Text_PrintWindow8002F44(&gUnknown_03004210); - MenuCursor_Create814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); -} - -void sub_8023AD8(void) -{ - sub_802BBD4(0x18, 8, 0x1D, 0xD, 1); - DestroyMenuCursor(); -} - -static void atk5A_yesnoboxlearnmove(void) -{ - gActiveBattler = 0; - switch (gBattleStruct->atk5A_StateTracker) - { - case 0: - sub_8023A80(); - gBattleStruct->atk5A_StateTracker++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] == 0) - { - sub_8023AD8(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleStruct->atk5A_StateTracker++; - return; - } - goto state_tracker_4; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - state_tracker_4: - gBattleStruct->atk5A_StateTracker = 4; - } - break; - case 2: - if (!gPaletteFade.active) - { - ShowSelectMovePokemonSummaryScreen(gPlayerParty, gBattleStruct->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn); - gBattleStruct->atk5A_StateTracker++; - } - break; - case 3: - if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2) - { - u8 move_pos = sub_809FA30(); - if (move_pos == 4) - { - gBattleStruct->atk5A_StateTracker = 4; - } - else - { - u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MOVE1 + move_pos); - if (IsHMMove2(move)) - { - PrepareStringBattle(0x13F, gActiveBattler); - gBattleStruct->atk5A_StateTracker = 5; - } - else - { - u8 *ptr; - - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - ptr = gBattleTextBuff2; - { - ptr[0] = 0xFD; - ptr[1] = 2; - ptr[2] = move; - ptr[3] = ((move & 0xFF00) >> 8); - ptr += 4; - } - ptr[0] = 0xFF; - RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterID], move_pos); - SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterID], gMoveToLearn, move_pos); - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[0].unk18_b & gBitTable[move_pos])) - { - RemoveBattleMonPPBonus(&gBattleMons[0], move_pos); - SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, move_pos); - } - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterID && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[2].unk18_b & gBitTable[move_pos])) - { - RemoveBattleMonPPBonus(&gBattleMons[2], move_pos); - SetBattleMonMoveSlot(&gBattleMons[2], gMoveToLearn, move_pos); - } - } - } - } - break; - case 4: - sub_8023AD8(); - gBattlescriptCurrInstr += 5; - break; - case 5: - if (gBattleExecBuffer == 0) - { - gBattleStruct->atk5A_StateTracker = 2; - } - break; - } -} - -static void atk5B_yesnoboxstoplearningmove(void) -{ - switch (gBattleStruct->atk5A_StateTracker) - { - case 0: - sub_8023A80(); - gBattleStruct->atk5A_StateTracker++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] != 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - sub_8023AD8(); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - sub_8023AD8(); - } - } -} - -static void atk5C_hitanimation(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - gBattlescriptCurrInstr += 2; - else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) - { - EmitHitAnimation(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; - } - else - gBattlescriptCurrInstr += 2; -} - -#define MONEY_UNKNOWN ((*(u8*)(ewram_addr + 0x17000 + 0x94))) - -#ifdef NONMATCHING -static void atk5D_getmoneyreward(void) -{ - int i = 0; - u8 r5 = 0; - u32 money_to_give; - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) - { - money_to_give = 2 * gBattleStruct->moneyMultiplier * MONEY_UNKNOWN; - } - else - { - switch(gTrainers[gTrainerBattleOpponent].partyFlags) - { - case 0: - { - const struct PokeTrainerData1 *data = &gTrainers[gTrainerBattleOpponent].party->noItemNoMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - case 2: - { - const struct PokeTrainerData2 *data = &gTrainers[gTrainerBattleOpponent].party->itemNoMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - case 1: - case 3: - { - const struct PokeTrainerData3 *data = &gTrainers[gTrainerBattleOpponent].party->itemMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - } - for (; gTrainerMoney[i * 4] != 0xFF && gTrainerMoney[i * 4 + 1] != gTrainers[gTrainerBattleOpponent].trainerClass ; i++) {} - - money_to_give = (r5 << 2) * gBattleStruct->moneyMultiplier; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - money_to_give = 2 * gTrainerMoney[i * 4 + 1] * money_to_give; - else - money_to_give = 1 * gTrainerMoney[i * 4 + 1] * money_to_give; - } - - AddMoney(&gSaveBlock1.money, money_to_give); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 4; - gBattleTextBuff1[3] = 5; - gBattleTextBuff1[4] = BYTE0(money_to_give); - gBattleTextBuff1[5] = BYTE1(money_to_give); - gBattleTextBuff1[6] = BYTE2(money_to_give); - gBattleTextBuff1[7] = BYTE3(money_to_give); - gBattleTextBuff1[8] = 0xFF; - - gBattlescriptCurrInstr += 1; -} -#else -NAKED -static void atk5D_getmoneyreward(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - movs r5, 0\n\ - ldr r0, _08024048 @ =gTrainerBattleOpponent\n\ - ldrh r2, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 3\n\ - cmp r2, r1\n\ - bne _08024058\n\ - ldr r0, _0802404C @ =gSharedMem + 0x17000\n\ - adds r1, r0, 0\n\ - adds r1, 0x94\n\ - ldrb r2, [r1]\n\ - ldr r1, _08024050 @ =0xfffff056\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r4, r2, 0\n\ - muls r4, r0\n\ - ldr r0, _08024054 @ =gSaveBlock1 + 0x490\n\ - mov r8, r0\n\ - b _08024140\n\ - .align 2, 0\n\ -_08024048: .4byte gTrainerBattleOpponent\n\ -_0802404C: .4byte gSharedMem + 0x17000\n\ -_08024050: .4byte 0xfffff056\n\ -_08024054: .4byte gSaveBlock1 + 0x490\n\ -_08024058:\n\ - ldr r2, _08024074 @ =gTrainers\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r3, r0, 3\n\ - adds r4, r3, r2\n\ - ldrb r1, [r4]\n\ - cmp r1, 0x1\n\ - beq _080240AE\n\ - cmp r1, 0x1\n\ - bgt _08024078\n\ - cmp r1, 0\n\ - beq _08024082\n\ - b _080240C4\n\ - .align 2, 0\n\ -_08024074: .4byte gTrainers\n\ -_08024078:\n\ - cmp r1, 0x2\n\ - beq _08024098\n\ - cmp r1, 0x3\n\ - beq _080240AE\n\ - b _080240C4\n\ -_08024082:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - subs r0, 0x8\n\ - b _080240C2\n\ -_08024098:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - subs r0, 0x8\n\ - b _080240C2\n\ -_080240AE:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - subs r0, 0x10\n\ -_080240C2:\n\ - ldrb r5, [r0, 0x2]\n\ -_080240C4:\n\ - ldr r0, _08024120 @ =gTrainerMoney\n\ - lsls r1, r6, 2\n\ - adds r3, r1, r0\n\ - ldrb r1, [r3]\n\ - mov r12, r0\n\ - lsls r4, r5, 2\n\ - ldr r5, _08024124 @ =gSharedMem\n\ - ldr r7, _08024128 @ =gBattleTypeFlags\n\ - ldr r0, _0802412C @ =gSaveBlock1 + 0x490\n\ - mov r8, r0\n\ - cmp r1, 0xFF\n\ - beq _080240FE\n\ - ldr r2, _08024130 @ =gTrainers\n\ - ldr r0, _08024134 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - ldrb r2, [r0, 0x1]\n\ - adds r1, r3, 0\n\ -_080240EE:\n\ - ldrb r0, [r1]\n\ - cmp r0, r2\n\ - beq _080240FE\n\ - adds r1, 0x4\n\ - adds r6, 0x1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFF\n\ - bne _080240EE\n\ -_080240FE:\n\ - ldr r1, _08024138 @ =0x00016056\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - adds r3, r4, 0\n\ - muls r3, r0\n\ - lsls r0, r6, 2\n\ - add r0, r12\n\ - ldrb r2, [r0, 0x1]\n\ - ldrh r1, [r7]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802413C\n\ - lsls r0, r2, 1\n\ - adds r4, r3, 0\n\ - muls r4, r0\n\ - b _08024140\n\ - .align 2, 0\n\ -_08024120: .4byte gTrainerMoney\n\ -_08024124: .4byte gSharedMem\n\ -_08024128: .4byte gBattleTypeFlags\n\ -_0802412C: .4byte gSaveBlock1 + 0x490\n\ -_08024130: .4byte gTrainers\n\ -_08024134: .4byte gTrainerBattleOpponent\n\ -_08024138: .4byte 0x00016056\n\ -_0802413C:\n\ - adds r4, r3, 0\n\ - muls r4, r2\n\ -_08024140:\n\ - mov r0, r8\n\ - adds r1, r4, 0\n\ - bl AddMoney\n\ - ldr r1, _0802418C @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x2]\n\ - movs r0, 0x5\n\ - strb r0, [r1, 0x3]\n\ - strb r4, [r1, 0x4]\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r4\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0xFF\n\ - lsls r0, 16\n\ - ands r0, r4\n\ - lsrs r0, 16\n\ - strb r0, [r1, 0x6]\n\ - lsrs r0, r4, 24\n\ - strb r0, [r1, 0x7]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x8]\n\ - ldr r1, _08024190 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802418C: .4byte gBattleTextBuff1\n\ -_08024190: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif //NONMATCHING - -/* -static u32 GetTrainerMoneyToGive(u16 trainerId) -{ - u32 i = 0; - u32 lastMonLevel = 0; - u32 moneyReward = 0; - - if (trainerId == SECRET_BASE_OPPONENT) - { - moneyReward = 20 * eSecretBaseRecord->partyLevels[0] * gBattleStruct->moneyMultiplier; - } - else - { - switch (gTrainers[trainerId].partyFlags) - { - case 0: - { - const struct TrainerMonNoItemDefaultMoves *party = gTrainers[trainerId].party.NoItemDefaultMoves; - lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; - } - break; - case F_TRAINER_PARTY_CUSTOM_MOVESET: - { - const struct TrainerMonNoItemCustomMoves *party = gTrainers[trainerId].party.NoItemCustomMoves; - lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; - } - break; - case F_TRAINER_PARTY_HELD_ITEM: - { - const struct TrainerMonItemDefaultMoves *party = gTrainers[trainerId].party.ItemDefaultMoves; - lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; - } - break; - case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: - { - const struct TrainerMonItemCustomMoves *party = gTrainers[trainerId].party.ItemCustomMoves; - lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl; - } - break; - } - - for (; gTrainerMoneyTable[i].classId != 0xFF; i++) - { - if (gTrainerMoneyTable[i].classId == gTrainers[trainerId].trainerClass) - break; - } - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * 2 * gTrainerMoneyTable[i].value; - else - moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * gTrainerMoneyTable[i].value; - } - - return moneyReward; -} - -static void atk5D_getmoneyreward(void) -{ - u32 moneyReward = GetTrainerMoneyToGive(gTrainerBattleOpponent_A); - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - moneyReward += GetTrainerMoneyToGive(gTrainerBattleOpponent_B); - - AddMoney(&gSaveBlock1Ptr->money, moneyReward); - - PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff1, 5, moneyReward) - - gBattlescriptCurrInstr++; -} -*/ - -static void atk5E_8025A70(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - switch (gBattleCommunication[0]) - { - case 0: - EmitGetAttributes(0, REQUEST_ALL_BATTLE, 0); - MarkBufferBankForExecution(gActiveBattler); - gBattleCommunication[0]++; - break; - case 1: - if (gBattleExecBuffer == 0) - { - int i; - struct BattlePokemon* bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4]; - for (i = 0; i < 4; i++) - { - gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i]; - gBattleMons[gActiveBattler].pp[i] = bufferPoke->pp[i]; - } - gBattlescriptCurrInstr += 2; - } - break; - } -} - -static void atk5F_8025B24(void) -{ - gActiveBattler = gBankAttacker; - gBankAttacker = gBankTarget; - gBankTarget = gActiveBattler; - //what is xor... - if (gHitMarker & HITMARKER_PURSUIT_TRAP) - gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); - else - gHitMarker |= HITMARKER_PURSUIT_TRAP; - gBattlescriptCurrInstr++; -} - -static void atk60_incrementgamestat(void) -{ - if (GetBattlerSide(gBankAttacker) == 0) - { - IncrementGameStat(T2_READ_8(gBattlescriptCurrInstr + 1)); - } - gBattlescriptCurrInstr += 2; -} - -static void atk61_drawpartystatussummary(void) -{ - int i; - struct Pokemon* party; - struct HpAndStatus hpStatus[6]; - if (gBattleExecBuffer) - return; - - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (GetBattlerSide(gActiveBattler) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - for (i = 0; i < 6; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES2) == 0 || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&party[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&party[i], MON_DATA_STATUS); - } - } - EmitDrawPartyStatusSummary(0, hpStatus, 1); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk62_08025C6C(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - Emitcmd49(0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk63_jumptorandomattack(void) -{ - if (T2_READ_8(gBattlescriptCurrInstr + 1)) - gCurrentMove = gRandomMove; - else - gChosenMove = gCurrentMove = gRandomMove; - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; -} - -static void atk64_statusanimation(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, 0, gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr += 2; - } -} - -static void atk65_status2animation(void) -{ - if (gBattleExecBuffer == 0) - { - u32 possible_to_anim; - gActiveBattler = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); - possible_to_anim = T1_READ_32(gBattlescriptCurrInstr + 2); - if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, 1, gBattleMons[gActiveBattler].status2 & possible_to_anim); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr += 6; - } -} - -static void atk66_chosenstatusanimation(void) -{ - if (gBattleExecBuffer == 0) - { - u32 status; - gActiveBattler = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); - status = T1_READ_32(gBattlescriptCurrInstr + 3); - if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, T1_READ_8(gBattlescriptCurrInstr + 2), status); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr += 7; - } -} - -static void atk67_yesnobox(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - sub_8023A80(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & B_BUTTON) - { - gBattleCommunication[1] = 1; - PlaySE(SE_SELECT); - sub_8023AD8(); - gBattlescriptCurrInstr++; - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8023AD8(); - gBattlescriptCurrInstr++; - } - break; - } -} - -static void atk68_cancelallactions(void) -{ - int i; - for (i = 0; i < gBattlersCount; i++) - { - gActionsByTurnOrder[i] = 0xC; - } - gBattlescriptCurrInstr++; -} - -static void atk69_adjustsetdamage(void) //literally a copy of atk07 except theres no rand dmg modifier... -{ - u8 hold_effect, quality; - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -void atk6A_removeitem(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - USED_HELD_ITEMS(gActiveBattler) = gBattleMons[gActiveBattler].item; - - gBattleMons[gActiveBattler].item = 0; - EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk6B_atknameinbuff1(void) -{ - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 7; - gBattleTextBuff1[2] = gBankAttacker; - gBattleTextBuff1[3] = gBattlerPartyIndexes[gBankAttacker]; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atk6C_drawlvlupbox(void) -{ - u8 r1 = 0; - u8 r7 = 0; - switch (gBattleStruct->atk6C_statetracker) - { - case 0: - sub_802BBD4(0xB, 0, 0x1D, 0x7, r1); - StringCopy(gStringVar4, BattleText_Format2); - - } -} - -#else -NAKED -static void atk6C_drawlvlupbox(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - movs r1, 0\n\ - movs r7, 0\n\ - ldr r0, _08024928 @ =gSharedMem\n\ - mov r10, r0\n\ - ldr r4, _0802492C @ =0x0001609c\n\ - add r4, r10\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x1\n\ - bne _0802491C\n\ - b _08024AF4\n\ -_0802491C:\n\ - cmp r0, 0x1\n\ - bgt _08024930\n\ - cmp r0, 0\n\ - beq _0802493E\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024928: .4byte gSharedMem\n\ -_0802492C: .4byte 0x0001609c\n\ -_08024930:\n\ - cmp r0, 0x2\n\ - bne _08024936\n\ - b _08024C04\n\ -_08024936:\n\ - cmp r0, 0x3\n\ - bne _0802493C\n\ - b _08024C30\n\ -_0802493C:\n\ - b _08024C38\n\ -_0802493E:\n\ - str r1, [sp]\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl sub_802BBD4\n\ - ldr r0, _0802499C @ =gStringVar4\n\ - ldr r1, _080249A0 @ =BattleText_Format2\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r1, 0\n\ - mov r8, r1\n\ -_0802495A:\n\ - movs r2, 0\n\ - mov r9, r2\n\ - ldr r0, _080249A4 @ =gUnknown_0840165C\n\ - mov r1, r8\n\ - lsls r4, r1, 2\n\ - adds r0, r4, r0\n\ - ldr r1, [r0]\n\ - adds r0, r5, 0\n\ - bl StringAppend\n\ - adds r5, r0, 0\n\ - ldr r0, _080249A8 @ =gSharedMem\n\ - ldr r2, _080249AC @ =0x00016018\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _080249B0 @ =gPlayerParty\n\ - adds r0, r1\n\ - ldr r1, _080249B4 @ =gLevelUpStatBoxStats\n\ - add r1, r8\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - mov r0, r8\n\ - cmp r0, 0x5\n\ - bhi _08024A1A\n\ - ldr r0, _080249B8 @ =_080249BC\n\ - adds r0, r4, r0\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0802499C: .4byte gStringVar4\n\ -_080249A0: .4byte BattleText_Format2\n\ -_080249A4: .4byte gUnknown_0840165C\n\ -_080249A8: .4byte gSharedMem\n\ -_080249AC: .4byte 0x00016018\n\ -_080249B0: .4byte gPlayerParty\n\ -_080249B4: .4byte gLevelUpStatBoxStats\n\ -_080249B8: .4byte _080249BC\n\ - .align 2, 0\n\ -_080249BC:\n\ - .4byte _080249D4\n\ - .4byte _080249E0\n\ - .4byte _080249EC\n\ - .4byte _080249F8\n\ - .4byte _08024A04\n\ - .4byte _08024A10\n\ -_080249D4:\n\ - ldr r0, _080249DC @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249DC: .4byte gSharedMem + 0x17180\n\ -_080249E0:\n\ - ldr r0, _080249E8 @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0x8]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249E8: .4byte gSharedMem + 0x17180\n\ -_080249EC:\n\ - ldr r0, _080249F4 @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0x2]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249F4: .4byte gSharedMem + 0x17180\n\ -_080249F8:\n\ - ldr r0, _08024A00 @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0xA]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_08024A00: .4byte gSharedMem + 0x17180\n\ -_08024A04:\n\ - ldr r0, _08024A0C @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0x4]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_08024A0C: .4byte gSharedMem + 0x17180\n\ -_08024A10:\n\ - ldr r0, _08024A54 @ =gSharedMem + 0x17180\n\ - ldrh r0, [r0, 0x6]\n\ -_08024A14:\n\ - subs r0, r1, r0\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ -_08024A1A:\n\ - lsls r0, r7, 16\n\ - asrs r0, 16\n\ - cmp r0, 0\n\ - bge _08024A2C\n\ - negs r0, r0\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ - movs r1, 0x1\n\ - add r9, r1\n\ -_08024A2C:\n\ - movs r0, 0xFC\n\ - strb r0, [r5]\n\ - movs r0, 0x13\n\ - strb r0, [r5, 0x1]\n\ - movs r1, 0x1\n\ - mov r2, r8\n\ - ands r1, r2\n\ - lsls r0, r1, 3\n\ - adds r0, r1\n\ - adds r0, 0x5\n\ - lsls r0, 3\n\ - adds r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - mov r0, r9\n\ - cmp r0, 0\n\ - beq _08024A5C\n\ - ldr r1, _08024A58 @ =BattleText_Dash\n\ - b _08024A5E\n\ - .align 2, 0\n\ -_08024A54: .4byte gSharedMem + 0x17180\n\ -_08024A58: .4byte BattleText_Dash\n\ -_08024A5C:\n\ - ldr r1, _08024AA4 @ =BattleText_Plus\n\ -_08024A5E:\n\ - adds r0, r5, 0\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r6, 0xFC\n\ - strb r6, [r5]\n\ - movs r4, 0x14\n\ - strb r4, [r5, 0x1]\n\ - movs r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - lsls r1, r7, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - adds r5, r0, 0\n\ - strb r6, [r5]\n\ - strb r4, [r5, 0x1]\n\ - movs r0, 0\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0x1\n\ - mov r1, r8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08024AA8\n\ - movs r0, 0xFE\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - adds r5, 0x1\n\ - b _08024AB8\n\ - .align 2, 0\n\ -_08024AA4: .4byte BattleText_Plus\n\ -_08024AA8:\n\ - strb r6, [r5]\n\ - movs r0, 0x11\n\ - strb r0, [r5, 0x1]\n\ - movs r0, 0x8\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0xFF\n\ - strb r0, [r5]\n\ -_08024AB8:\n\ - movs r2, 0x1\n\ - add r8, r2\n\ - mov r0, r8\n\ - cmp r0, 0x5\n\ - bgt _08024AC4\n\ - b _0802495A\n\ -_08024AC4:\n\ - ldr r4, _08024AE4 @ =gUnknown_03004210\n\ - ldr r1, _08024AE8 @ =gStringVar4\n\ - adds r2, 0xFF\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - adds r0, r4, 0\n\ - movs r3, 0xC\n\ - bl Text_InitWindow\n\ - adds r0, r4, 0\n\ - bl Text_PrintWindow8002F44\n\ - ldr r1, _08024AEC @ =gSharedMem\n\ - ldr r2, _08024AF0 @ =0x0001609c\n\ - adds r1, r2\n\ - b _08024BEA\n\ - .align 2, 0\n\ -_08024AE4: .4byte gUnknown_03004210\n\ -_08024AE8: .4byte gStringVar4\n\ -_08024AEC: .4byte gSharedMem\n\ -_08024AF0: .4byte 0x0001609c\n\ -_08024AF4:\n\ - ldr r0, _08024B94 @ =gMain\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - bne _08024AFE\n\ - b _08024C38\n\ -_08024AFE:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - ldr r0, _08024B98 @ =gStringVar4\n\ - ldr r1, _08024B9C @ =BattleText_Format2\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r0, 0\n\ - mov r8, r0\n\ - mov r9, r0\n\ - movs r6, 0xFC\n\ - movs r7, 0x14\n\ - ldr r1, _08024BA0 @ =0x00016018\n\ - add r10, r1\n\ -_08024B1C:\n\ - ldr r1, _08024BA4 @ =gUnknown_0840165C\n\ - mov r2, r8\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - adds r0, r5, 0\n\ - bl StringAppend\n\ - adds r5, r0, 0\n\ - mov r0, r10\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08024BA8 @ =gPlayerParty\n\ - adds r0, r1\n\ - ldr r1, _08024BAC @ =gLevelUpStatBoxStats\n\ - add r1, r8\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - adds r1, r0, 0\n\ - strb r6, [r5]\n\ - movs r0, 0x13\n\ - strb r0, [r5, 0x1]\n\ - movs r4, 0x1\n\ - mov r2, r8\n\ - ands r4, r2\n\ - lsls r0, r4, 3\n\ - adds r0, r4\n\ - adds r0, 0x5\n\ - lsls r0, 3\n\ - adds r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - strb r6, [r5]\n\ - strb r7, [r5, 0x1]\n\ - movs r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x3\n\ - bl ConvertIntToDecimalStringN\n\ - adds r5, r0, 0\n\ - strb r6, [r5]\n\ - strb r7, [r5, 0x1]\n\ - mov r0, r9\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - cmp r4, 0\n\ - beq _08024BB0\n\ - movs r0, 0xFE\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - adds r5, 0x1\n\ - b _08024BC0\n\ - .align 2, 0\n\ -_08024B94: .4byte gMain\n\ -_08024B98: .4byte gStringVar4\n\ -_08024B9C: .4byte BattleText_Format2\n\ -_08024BA0: .4byte 0x00016018\n\ -_08024BA4: .4byte gUnknown_0840165C\n\ -_08024BA8: .4byte gPlayerParty\n\ -_08024BAC: .4byte gLevelUpStatBoxStats\n\ -_08024BB0:\n\ - strb r6, [r5]\n\ - movs r0, 0x11\n\ - strb r0, [r5, 0x1]\n\ - movs r0, 0x8\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0xFF\n\ - strb r0, [r5]\n\ -_08024BC0:\n\ - movs r1, 0x1\n\ - add r8, r1\n\ - mov r2, r8\n\ - cmp r2, 0x5\n\ - ble _08024B1C\n\ - ldr r4, _08024BF4 @ =gUnknown_03004210\n\ - ldr r1, _08024BF8 @ =gStringVar4\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - adds r0, r4, 0\n\ - movs r3, 0xC\n\ - bl Text_InitWindow\n\ - adds r0, r4, 0\n\ - bl Text_PrintWindow8002F44\n\ - ldr r1, _08024BFC @ =gSharedMem\n\ - ldr r0, _08024C00 @ =0x0001609c\n\ - adds r1, r0\n\ -_08024BEA:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024BF4: .4byte gUnknown_03004210\n\ -_08024BF8: .4byte gStringVar4\n\ -_08024BFC: .4byte gSharedMem\n\ -_08024C00: .4byte 0x0001609c\n\ -_08024C04:\n\ - ldr r0, _08024C2C @ =gMain\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - beq _08024C38\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl sub_802BBD4\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024C2C: .4byte gMain\n\ -_08024C30:\n\ - ldr r1, _08024C48 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ -_08024C38:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08024C48: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -#endif - -static void atk6D_resetsentmonsvalue(void) -{ - ResetSentPokesToOpponentValue(); - gBattlescriptCurrInstr++; -} - -static void atk6E_setatktoplayer0(void) -{ - gBankAttacker = GetBattlerAtPosition(0); - gBattlescriptCurrInstr++; -} - -static void atk6F_makevisible(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - EmitSpriteInvisibility(0, 0); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; -} - -static void atk70_recordlastability(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - gBattlescriptCurrInstr += 1; //buggy, should be += 2, one byte for command, one byte for argument... -} - -void sub_8024CEC(void) -{ - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 2; - gBattleTextBuff2[2] = (gMoveToLearn); - gBattleTextBuff2[3] = uBYTE1_16(gMoveToLearn); - gBattleTextBuff2[4] = 0xFF; -} - -static void atk71_buffermovetolearn(void) -{ - sub_8024CEC(); - gBattlescriptCurrInstr++; -} - -static void atk72_jumpifplayerran(void) -{ - if (TryRunFromBattle(gBank1)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atk73_hpthresholds(void) -{ - u8 opposing_bank; - s32 result; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - opposing_bank = gActiveBattler ^ 1; - - result = gBattleMons[opposing_bank].hp * 100 / gBattleMons[opposing_bank].maxHP; - if (result == 0) - result = 1; - - if (result >= 70 || !gBattleMons[opposing_bank].hp) - gBattleStruct->hpScale = 0; - else if (result >= 40) - gBattleStruct->hpScale = 1; - else if (result >= 10) - gBattleStruct->hpScale = 2; - else - gBattleStruct->hpScale = 3; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk74_hpthresholds2(void) -{ - u8 opposing_bank; - u8 hp_switchout; - s32 result; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - opposing_bank = gActiveBattler ^ 1; - hp_switchout = ewram160BCarr(GetBattlerSide(opposing_bank)); //gBattleStruct->HP_OnSwitchout[GetBattlerSide(opposing_bank)]; - result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout; - - if (gBattleMons[opposing_bank].hp >= hp_switchout) - gBattleStruct->hpScale = 0; - else if (result <= 29) - gBattleStruct->hpScale = 1; - else if (result <= 69) - gBattleStruct->hpScale = 2; - else - gBattleStruct->hpScale = 3; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk75_useitemonopponent(void) -{ - gBankInMenu = gBankAttacker; - PokemonUseItemEffects(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker]], gLastUsedItem, gBattlerPartyIndexes[gBankAttacker], 0, 1); - gBattlescriptCurrInstr += 1; -} - -static void atk76_various(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - switch (T2_READ_8(gBattlescriptCurrInstr + 2)) - { - case 0: - CancelMultiTurnMoves(gActiveBattler); - break; - case 1: - { - u8 side; - gBankAttacker = gBankTarget; - side = GetBattlerSide(gBankAttacker) ^ 1; - if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) - gBankTarget = gSideTimers[side].followmeTarget; - else - gBankTarget = gActiveBattler; - } - break; - case 2: - gBattleCommunication[0] = CanRunFromBattle(); - break; - case 3: - gBankTarget = GetMoveTarget(gCurrentMove, 0); - break; - case 4: - if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) - gBattleCommunication[0] = 1; - else - gBattleCommunication[0] = 0; - break; - case 5: - gSpecialStatuses[gActiveBattler].intimidatedPoke = 0; - gSpecialStatuses[gActiveBattler].traced = 0; - break; - case 6: - { - int i; - u16* choiced_move; - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID) - goto ACTIVE_0; - if (gBattlerPartyIndexes[2] != gBattleStruct->expGetterID) - break; - if (gBattlerPartyIndexes[0] == gBattlerPartyIndexes[2]) - { - ACTIVE_0: - gActiveBattler = 0; - } - else - gActiveBattler = 2; - - choiced_move = CHOICED_MOVE(gActiveBattler); - for (i = 0; i < 4; i++) - { - if (gBattleMons[gActiveBattler].moves[i] == *choiced_move) - break; - } - if (i == 4) - *choiced_move = 0; - } - break; - } - - gBattlescriptCurrInstr += 3; -} - -static void atk77_setprotectlike(void) //protect and endure -{ - bool8 not_last_turn = 1; - u16 last_move = gUnknown_02024C4C[gBankAttacker]; - - if (last_move != MOVE_PROTECT && last_move != MOVE_DETECT && last_move != MOVE_ENDURE) - gDisableStructs[gBankAttacker].protectUses = 0; - if (gCurrentTurnActionNumber == (gBattlersCount - 1)) - not_last_turn = 0; - - if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] > Random() && not_last_turn) - { - if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) - { - gProtectStructs[gBankAttacker].protected = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) //what is else if - { - gProtectStructs[gBankAttacker].endured = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - gDisableStructs[gBankAttacker].protectUses++; - } - else - { - gDisableStructs[gBankAttacker].protectUses = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - gMoveResultFlags |= MOVE_RESULT_MISSED; - } - - gBattlescriptCurrInstr++; -} - -static void atk78_faintifabilitynotdamp(void) -{ - if (gBattleExecBuffer) - return; - - for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++) - { - if (gBattleMons[gBankTarget].ability == ABILITY_DAMP) - break; - } - - if (gBankTarget == gBattlersCount) - { - gActiveBattler = gBankAttacker; - gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - EmitHealthBarUpdate(0, 0x7FFF); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr++; - - for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) - break; - } - } - else - { - gLastUsedAbility = ABILITY_DAMP; - RecordAbilityBattle(gBankTarget, gBattleMons[gBankTarget].ability); - gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; - } -} - -static void atk79_setatkhptozero(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBattler = gBankAttacker; - gBattleMons[gActiveBattler].hp = 0; - EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp); - MarkBufferBankForExecution(gActiveBattler); - - gBattlescriptCurrInstr++; -} - -static void atk7A_jumpifnexttargetvalid(void) //used by intimidate to loop through all targets -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - for (gBankTarget++; ; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) - break; - } - - if (gBankTarget >= gBattlersCount) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = jump_loc; - } - else - gBattlescriptCurrInstr += 5; -} - -static void atk7B_tryhealhalfhealth(void) -{ - u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - - if (T2_READ_8(gBattlescriptCurrInstr + 5) == 1) - gBankTarget = gBankAttacker; - - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = fail_loc; - else - gBattlescriptCurrInstr += 6; -} - -static void atk7C_trymirrormove(void) -{ - u16 r7 = ewram160ACarr2(0, gBankAttacker) | (ewram160ACarr2(1, gBankAttacker) << 8); - u16 r6 = ewram16100arr2(0, gBankAttacker) | (ewram16100arr2(1, gBankAttacker) << 8); - u16 r5 = ewram16100arr2(2, gBankAttacker) | (ewram16100arr2(3, gBankAttacker) << 8); - - if (r7 != 0 && r7 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r7; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - } - else if (r6 != 0 && r5 != 0 && r6 != 0xFFFF && r5 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - if (Random() & 1) - gCurrentMove = r6; - else - gCurrentMove = r5; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - } - else if (r6 != 0 && r6 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r6; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - } - else if (r5 != 0 && r5 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r5; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr++; - } -} - -static void atk7D_setrain(void) -{ - if (gBattleWeather & WEATHER_RAIN_ANY) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_RAIN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atk7E_setreflect(void) -{ - if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_REFLECT) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_REFLECT; - gSideTimers[GetBattlerPosition(gBankAttacker) & 1].reflectTimer = 5; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - gBattlescriptCurrInstr++; -} - -static void atk7F_setseeded(void) -{ - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBankTarget] & STATUS3_LEECHSEED) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else if (gBattleMons[gBankTarget].type1 == TYPE_GRASS || gBattleMons[gBankTarget].type2 == TYPE_GRASS) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gStatuses3[gBankTarget] |= gBankAttacker; - gStatuses3[gBankTarget] |= STATUS3_LEECHSEED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - - gBattlescriptCurrInstr++; -} - -static void atk80_manipulatedamage(void) -{ - switch (T2_READ_8(gBattlescriptCurrInstr + 1)) - { - case 0: - gBattleMoveDamage *= -1; - break; - case 1: - gBattleMoveDamage /= 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if ((gBattleMons[gBankTarget].maxHP / 2) < gBattleMoveDamage) - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - break; - case 2: - gBattleMoveDamage *= 2; - break; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk81_trysetrest(void) -{ - u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - gActiveBattler = gBankTarget = gBankAttacker; - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP * (-1); - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = fail_loc; - else - { - if (gBattleMons[gBankTarget].status1 & ((u8)(~STATUS_SLEEP))) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - - gBattleMons[gBankTarget].status1 = 3; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 5; - } -} - -static void atk82_jumpifnotfirstturn(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - - if (gDisableStructs[gBankAttacker].isFirstTurn) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = jump_loc; -} - -static void atk83_nop(void) -{ - gBattlescriptCurrInstr++; -} - -bool8 UproarWakeUpCheck(u8 bank) -{ - int i; - for (i = 0; i < gBattlersCount; i++) - { - 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... - continue; - gBattleStruct->scriptingActive = i; - if (gBankTarget == 0xFF) - gBankTarget = i; - else if (gBankTarget == i) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - break; - } - if (i == gBattlersCount) - return 0; - else - return 1; -} - -static void atk84_jumpifcantmakeasleep(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - if (UproarWakeUpCheck(gBankTarget)) - gBattlescriptCurrInstr = jump_loc; - else if (gBattleMons[gBankTarget].ability == ABILITY_INSOMNIA || gBattleMons[gBankTarget].ability == ABILITY_VITAL_SPIRIT) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - gBattlescriptCurrInstr += 5; - } -} - -static void atk85_stockpile(void) -{ - if (gDisableStructs[gBankAttacker].stockpileCounter == 3) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gDisableStructs[gBankAttacker].stockpileCounter++; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 1; - gBattleTextBuff1[4] = gDisableStructs[gBankAttacker].stockpileCounter; - gBattleTextBuff1[5] = 0xFF; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk86_stockpiletobasedamage(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - if (gDisableStructs[gBankAttacker].stockpileCounter == 0) - { - gBattlescriptCurrInstr = jump_loc; - } - else - { - if (gBattleCommunication[6] != 1) - { - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - gSideAffecting[GetBattlerPosition(gBankTarget) & 1], 0, - 0, gBankAttacker, gBankTarget) - * gDisableStructs[gBankAttacker].stockpileCounter; - gBattleStruct->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; - - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - } - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr += 5; - } -} - -static void atk87_stockpiletohpheal(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - if (gDisableStructs[gBankAttacker].stockpileCounter == 0) - { - gBattlescriptCurrInstr = jump_loc; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else if (gBattleMons[gBankAttacker].maxHP == gBattleMons[gBankAttacker].hp) - { - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr = jump_loc; - gBankTarget = gBankAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / (1 << (3 - gDisableStructs[gBankAttacker].stockpileCounter)); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - gBattleStruct->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr += 5; - gBankTarget = gBankAttacker; - } -} - -static void atk88_negativedamage(void) -{ - gBattleMoveDamage = -(gHpDealt / 2); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = -1; - gBattlescriptCurrInstr++; -} - -static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) -{ - bool8 certain = FALSE; - bool8 notProtectAffected = FALSE; - u32 index; - - if (flags & MOVE_EFFECT_AFFECTS_USER) - gActiveBattler = gBankAttacker; - else - gActiveBattler = gBankTarget; - - flags &= ~(MOVE_EFFECT_AFFECTS_USER); - - if (flags & MOVE_EFFECT_CERTAIN) - certain++; - flags &= ~(MOVE_EFFECT_CERTAIN); - - if (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED) - notProtectAffected++; - flags &= ~(STAT_CHANGE_NOT_PROTECT_AFFECTED); - - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId) - - if ((statValue << 0x18) < 0) // stat decrease - { - if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer - && !certain && gCurrentMove != MOVE_CURSE) - { - if (flags == STAT_CHANGE_BS_PTR) - { - if (gSpecialStatuses[gActiveBattler].statLowered) - { - gBattlescriptCurrInstr = BS_ptr; - } - else - { - BattleScriptPush(BS_ptr); - gBattleStruct->scriptingActive = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_MistProtected; - gSpecialStatuses[gActiveBattler].statLowered = 1; - } - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gCurrentMove != MOVE_CURSE - && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(0)) - { - gBattlescriptCurrInstr = BattleScript_ButItFailed; - return STAT_CHANGE_DIDNT_WORK; - } - else if ((gBattleMons[gActiveBattler].ability == ABILITY_CLEAR_BODY - || gBattleMons[gActiveBattler].ability == ABILITY_WHITE_SMOKE) - && !certain && gCurrentMove != MOVE_CURSE) - { - if (flags == STAT_CHANGE_BS_PTR) - { - if (gSpecialStatuses[gActiveBattler].statLowered) - { - gBattlescriptCurrInstr = BS_ptr; - } - else - { - BattleScriptPush(BS_ptr); - gBattleStruct->scriptingActive = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - gSpecialStatuses[gActiveBattler].statLowered = 1; - } - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE - && !certain && statId == STAT_STAGE_ACC) - { - if (flags == STAT_CHANGE_BS_PTR) - { - BattleScriptPush(BS_ptr); - gBattleStruct->scriptingActive = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER - && !certain && statId == STAT_STAGE_ATK) - { - if (flags == STAT_CHANGE_BS_PTR) - { - BattleScriptPush(BS_ptr); - gBattleStruct->scriptingActive = gActiveBattler; - gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - } - return STAT_CHANGE_DIDNT_WORK; - } - else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && flags == 0) - { - return STAT_CHANGE_DIDNT_WORK; - } - else // try to decrease - { - statValue = -GET_STAT_BUFF_VALUE(statValue); - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - index = 1; - if (statValue == -2) - { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATHARSHLY; - gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; - index = 4; - } - gBattleTextBuff2[index] = B_BUFF_STRING; - index++; - gBattleTextBuff2[index] = STRINGID_STATFELL; - index++; - gBattleTextBuff2[index] = STRINGID_STATFELL >> 8; - index++; - gBattleTextBuff2[index] = B_BUFF_EOS; - - if (gBattleMons[gActiveBattler].statStages[statId] == 0) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else - gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBattler); - - } - } - else // stat increase - { - statValue = GET_STAT_BUFF_VALUE(statValue); - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - index = 1; - if (statValue == 2) - { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATSHARPLY; - gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; - index = 4; - } - gBattleTextBuff2[index] = B_BUFF_STRING; - index++; - gBattleTextBuff2[index] = STRINGID_STATROSE; - index++; - gBattleTextBuff2[index] = STRINGID_STATROSE >> 8; - index++; - gBattleTextBuff2[index] = B_BUFF_EOS; - - if (gBattleMons[gActiveBattler].statStages[statId] == 0xC) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else - gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBattler); - } - - gBattleMons[gActiveBattler].statStages[statId] += statValue; - if (gBattleMons[gActiveBattler].statStages[statId] < 0) - gBattleMons[gActiveBattler].statStages[statId] = 0; - if (gBattleMons[gActiveBattler].statStages[statId] > 0xC) - gBattleMons[gActiveBattler].statStages[statId] = 0xC; - - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && flags & STAT_CHANGE_BS_PTR) - gMoveResultFlags |= MOVE_RESULT_MISSED; - - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & STAT_CHANGE_BS_PTR)) - return STAT_CHANGE_DIDNT_WORK; - - return STAT_CHANGE_WORKED; -} - -static void atk89_statbuffchange(void) -{ - u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2); - if (ChangeStatBuffs(gBattleStruct->statChanger & 0xF0, gBattleStruct->statChanger & 0xF, T2_READ_8(gBattlescriptCurrInstr + 1), jump_loc) == 0) - gBattlescriptCurrInstr += 6; -} - -static void atk8A_normalisebuffs(void) //haze -{ - int i, j; - for (i = 0; i < gBattlersCount; i++) - { - for (j = 0; j < 8; j++) - { - gBattleMons[i].statStages[j] = 6; - } - } - gBattlescriptCurrInstr++; -} - -static void atk8B_setbide(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gBankAttacker] = gCurrentMove; - gTakenDmg[gBankAttacker] = 0; - gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); //2 turns - gBattlescriptCurrInstr++; -} - -static void atk8C_confuseifrepeatingattackends(void) -{ - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_LOCK_CONFUSE)) - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x75; - gBattlescriptCurrInstr++; -} - -static void atk8D_setmultihitcounter(void) -{ - if (T2_READ_8(gBattlescriptCurrInstr + 1)) - gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1); - else - { - gMultiHitCounter = Random() & 3; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() & 3) + 2; - else - gMultiHitCounter += 2; - } - gBattlescriptCurrInstr += 2; -} - -static void atk8E_initmultihitstring(void) -{ - ewram160E0(0) = 0xFD; - ewram160E0(1) = 1; - ewram160E0(2) = 1; - ewram160E0(3) = 1; - ewram160E0(4) = 0; - ewram160E0(5) = 0xFF; - gBattlescriptCurrInstr++; -} - -static bool8 sub_80264C0(void) -{ - if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level) - { - ewram16064arr(gBankTarget) = gBattlerPartyIndexes[gBankTarget]; - } - else - { - u16 random = Random() & 0xFF; - if ((u32)((random * (gBattleMons[gBankAttacker].level + gBattleMons[gBankTarget].level) >> 8) + 1) <= (gBattleMons[gBankTarget].level / 4)) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - return 0; - } - ewram16064arr(gBankTarget) = gBattlerPartyIndexes[gBankTarget]; - } - gBattlescriptCurrInstr = BattleScript_SuccessForceOut; - return 1; -} - -static void atk8F_forcerandomswitch(void) -{ - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)) - { - u8 i; - struct Pokemon* party; - u8 valid; - u8 val; - if (!GetBattlerSide(gBankTarget)) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - valid = 0; - val = 0; - if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1) - val = 3; - for (i = val; i < val + 3; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && GetMonData(&party[i], MON_DATA_HP) != 0) - valid++; - } - } - else - { - valid = 0; - for (i = 0; i < 6; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && GetMonData(&party[i], MON_DATA_HP) != 0) - valid++; - } - } - - if ((valid < 2 && (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) - || (valid < 3 && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else if (sub_80264C0()) - { -#define MON_CAN_BATTLE(mon) (((GetMonData(mon, MON_DATA_SPECIES) && GetMonData(mon, MON_DATA_IS_EGG) != 1 && GetMonData(mon, MON_DATA_HP)))) - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - do - { - val = Random() % 3; - if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1) - i = val + 3; - else - i = val; - } while (i == gBattlerPartyIndexes[gBankTarget] || i == gBattlerPartyIndexes[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - do - { - i = Random() % 6; - } while (i == gBattlerPartyIndexes[gBankTarget] || i == gBattlerPartyIndexes[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); - } - else - { - do - { - i = Random() % 6; - } while (i == gBattlerPartyIndexes[gBankTarget] || !MON_CAN_BATTLE(&party[i])); - } - } - ewram16068arr(gBankTarget) = i; - if (!IsLinkDoubleBattle()) - sub_8012258(gBankTarget); - sub_8094B6C(gBankTarget, i, 0); - sub_8094B6C(gBankTarget ^ 2, i, 1); -#undef MON_CAN_BATTLE - } - } - else - { - sub_80264C0(); - } -} - -static void atk90_tryconversiontypechange(void) -{ - //randomly changes user's type to one of its moves' type - u8 valid_moves = 0; - u8 checked_move; - u8 move_type; - while (valid_moves < 4) - { - if (gBattleMons[gBankAttacker].moves[valid_moves] == 0) - break; - valid_moves++; - } - - for (checked_move = 0; checked_move < valid_moves; checked_move++) - { - move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type; - if (move_type == TYPE_MYSTERY) - { - if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST) - move_type = TYPE_GHOST; - else - move_type = TYPE_NORMAL; - } - if (move_type != gBattleMons[gBankAttacker].type1 && move_type != gBattleMons[gBankAttacker].type2) - break; - } - - if (checked_move == valid_moves) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - do - { - - while ((checked_move = Random() & 3) >= valid_moves); - - move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type; - if (move_type == TYPE_MYSTERY) - { - if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST) - move_type = TYPE_GHOST; - else - move_type = TYPE_NORMAL; - } - } while (move_type == gBattleMons[gBankAttacker].type1 || move_type == gBattleMons[gBankAttacker].type2); - - gBattleMons[gBankAttacker].type1 = move_type; - gBattleMons[gBankAttacker].type2 = move_type; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = move_type; - gBattleTextBuff1[3] = 0xFF; - - gBattlescriptCurrInstr += 5; - } -} - -static void atk91_givepaydaymoney(void) -{ - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney) - { - AddMoney(&gSaveBlock1.money, gPaydayMoney * gBattleStruct->moneyMultiplier); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 2; - gBattleTextBuff1[3] = 5; - gBattleTextBuff1[4] = gPaydayMoney; - gBattleTextBuff1[5] = uBYTE1_16(gPaydayMoney); - gBattleTextBuff1[6] = 0xFF; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString; - } - else - gBattlescriptCurrInstr++; -} - -static void atk92_setlightscreen(void) -{ - if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_LIGHTSCREEN) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_LIGHTSCREEN; - gSideTimers[GetBattlerPosition(gBankAttacker) & 1].lightscreenTimer = 5; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - } - gBattlescriptCurrInstr++; -} - -#ifdef NOTMATCHING -static void atk93_tryKO(void) -{ - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_STURDY) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastUsedAbility = ABILITY_STURDY; - gBattlescriptCurrInstr = x; - RecordAbilityBattle(gBankTarget, ABILITY_STURDY); - return; - } - - if (!(gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS)) - { - u16 to_cmp = gBattleMons[gBankAttacker].level - gBattleMons[gBankTarget].level + gBattleMoves[gCurrentMove].accuracy; - if (Random() % 0x64 + 1 < to_cmp || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - { - goto MOVE_RESULT_MISSED_LABEL; - } - } - else - { - if (gDisableStructs[gBankTarget].bankWithSureHit != gBankAttacker || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - { - - } - } - -MOVE_RESULT_MISSED_LABEL: - gBattleTypeFlags |= MOVE_RESULT_MISSED; - if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#else -__attribute((naked)) -static void atk93_tryKO(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r7, _08026BA8 @ =gBattleMons\n\ - ldr r6, _08026BAC @ =gBankTarget\n\ - ldrb r2, [r6]\n\ - movs r5, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r5\n\ - adds r1, r0, r7\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0xAF\n\ - bne _08026BB4\n\ - ldr r1, _08026BB0 @ =gEnigmaBerries\n\ - lsls r0, r2, 3\n\ - subs r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x7]\n\ - ldrb r6, [r0, 0x1A]\n\ - b _08026BCE\n\ - .align 2, 0\n\ -_08026BA8: .4byte gBattleMons\n\ -_08026BAC: .4byte gBankTarget\n\ -_08026BB0: .4byte gEnigmaBerries\n\ -_08026BB4:\n\ - ldrh r0, [r1, 0x2E]\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldrb r0, [r6]\n\ - muls r0, r5\n\ - adds r0, r7\n\ - ldrh r0, [r0, 0x2E]\n\ - bl ItemId_GetHoldEffectParam\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ -_08026BCE:\n\ - ldr r1, _08026C4C @ =gStringBank\n\ - ldr r5, _08026C50 @ =gBankTarget\n\ - ldrb r0, [r5]\n\ - strb r0, [r1]\n\ - cmp r4, 0x27\n\ - bne _08026C0C\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x64\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, r6\n\ - bcs _08026C0C\n\ - ldrb r0, [r5]\n\ - movs r1, 0x27\n\ - bl RecordItemBattle\n\ - ldr r2, _08026C54 @ =gSpecialStatuses\n\ - ldrb r1, [r5]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r2, 0x80\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08026C0C:\n\ - ldr r0, _08026C58 @ =gBattleMons\n\ - mov r8, r0\n\ - ldr r1, _08026C50 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - mov r3, r8\n\ - adds r5, r0, r3\n\ - adds r0, r5, 0\n\ - adds r0, 0x20\n\ - ldrb r3, [r0]\n\ - mov r10, r8\n\ - cmp r3, 0x5\n\ - bne _08026C6C\n\ - ldr r2, _08026C5C @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r0, _08026C60 @ =gLastUsedAbility\n\ - strb r3, [r0]\n\ - ldr r1, _08026C64 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08026C68 @ =BattleScript_SturdyPreventsOHKO\n\ - str r0, [r1]\n\ - ldr r1, _08026C50 @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - movs r1, 0x5\n\ - bl RecordAbilityBattle\n\ - b _08026E40\n\ - .align 2, 0\n\ -_08026C4C: .4byte gStringBank\n\ -_08026C50: .4byte gBankTarget\n\ -_08026C54: .4byte gSpecialStatuses\n\ -_08026C58: .4byte gBattleMons\n\ -_08026C5C: .4byte gMoveResultFlags\n\ -_08026C60: .4byte gLastUsedAbility\n\ -_08026C64: .4byte gBattlescriptCurrInstr\n\ -_08026C68: .4byte BattleScript_SturdyPreventsOHKO\n\ -_08026C6C:\n\ - ldr r1, _08026CE0 @ =gStatuses3\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08026CF4\n\ - ldr r1, _08026CE4 @ =gBattleMoves\n\ - ldr r0, _08026CE8 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - lsls r2, r0, 1\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r1\n\ - ldr r7, _08026CEC @ =gBankAttacker\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r0, [r0]\n\ - adds r1, r5, 0\n\ - adds r1, 0x2A\n\ - ldrb r1, [r1]\n\ - subs r0, r1\n\ - ldrb r2, [r2, 0x3]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x64\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - adds r0, 0x1\n\ - cmp r0, r4\n\ - bge _08026CDC\n\ - ldrb r0, [r7]\n\ - adds r1, r0, 0\n\ - muls r1, r6\n\ - add r1, r10\n\ - adds r1, 0x2A\n\ - ldr r2, _08026CF0 @ =gBankTarget\n\ - ldrb r0, [r2]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r1, [r1]\n\ - movs r4, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bcs _08026D20\n\ -_08026CDC:\n\ - mov r10, r8\n\ - b _08026DE0\n\ - .align 2, 0\n\ -_08026CE0: .4byte gStatuses3\n\ -_08026CE4: .4byte gBattleMoves\n\ -_08026CE8: .4byte gCurrentMove\n\ -_08026CEC: .4byte gBankAttacker\n\ -_08026CF0: .4byte gBankTarget\n\ -_08026CF4:\n\ - ldr r0, _08026D4C @ =gDisableStructs\n\ - lsls r1, r2, 3\n\ - subs r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldr r2, _08026D50 @ =gBankAttacker\n\ - ldrb r0, [r1, 0x15]\n\ - movs r4, 0\n\ - ldrb r3, [r2]\n\ - cmp r0, r3\n\ - bne _08026D20\n\ - ldrb r0, [r2]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - adds r1, r5, 0\n\ - adds r1, 0x2A\n\ - ldrb r0, [r0]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08026D20\n\ - movs r4, 0x1\n\ -_08026D20:\n\ - cmp r4, 0\n\ - beq _08026DE0\n\ - ldr r0, _08026D54 @ =gProtectStructs\n\ - ldr r1, _08026D58 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - lsls r1, r2, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - lsls r0, 30\n\ - cmp r0, 0\n\ - bge _08026D64\n\ - ldr r1, _08026D5C @ =gBattleMoveDamage\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - subs r0, 0x1\n\ - str r0, [r1]\n\ - ldr r2, _08026D60 @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x40\n\ - b _08026DC6\n\ - .align 2, 0\n\ -_08026D4C: .4byte gDisableStructs\n\ -_08026D50: .4byte gBankAttacker\n\ -_08026D54: .4byte gProtectStructs\n\ -_08026D58: .4byte gBankTarget\n\ -_08026D5C: .4byte gBattleMoveDamage\n\ -_08026D60: .4byte gMoveResultFlags\n\ -_08026D64:\n\ - ldr r0, _08026DA0 @ =gSpecialStatuses\n\ - lsls r1, r2, 2\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - lsrs r0, 7\n\ - cmp r0, 0\n\ - beq _08026DB4\n\ - ldr r1, _08026DA4 @ =gBattleMoveDamage\n\ - movs r3, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r3\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - subs r0, 0x1\n\ - str r0, [r1]\n\ - ldr r2, _08026DA8 @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x80\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r1, _08026DAC @ =gLastUsedItem\n\ - ldr r2, _08026DB0 @ =gBankTarget\n\ - ldrb r0, [r2]\n\ - muls r0, r3\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x2E]\n\ - strh r0, [r1]\n\ - b _08026DCA\n\ - .align 2, 0\n\ -_08026DA0: .4byte gSpecialStatuses\n\ -_08026DA4: .4byte gBattleMoveDamage\n\ -_08026DA8: .4byte gMoveResultFlags\n\ -_08026DAC: .4byte gLastUsedItem\n\ -_08026DB0: .4byte gBankTarget\n\ -_08026DB4:\n\ - ldr r1, _08026DD4 @ =gBattleMoveDamage\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - str r0, [r1]\n\ - ldr r2, _08026DD8 @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x10\n\ -_08026DC6:\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ -_08026DCA:\n\ - ldr r1, _08026DDC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _08026E40\n\ - .align 2, 0\n\ -_08026DD4: .4byte gBattleMoveDamage\n\ -_08026DD8: .4byte gMoveResultFlags\n\ -_08026DDC: .4byte gBattlescriptCurrInstr\n\ -_08026DE0:\n\ - ldr r2, _08026E10 @ =gMoveResultFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r0, _08026E14 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - movs r2, 0x58\n\ - adds r1, r0, 0\n\ - muls r1, r2\n\ - add r1, r10\n\ - adds r1, 0x2A\n\ - ldr r3, _08026E18 @ =gBankTarget\n\ - ldrb r0, [r3]\n\ - muls r0, r2\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r1, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bcc _08026E20\n\ - ldr r1, _08026E1C @ =gBattleCommunication\n\ - movs r0, 0\n\ - b _08026E24\n\ - .align 2, 0\n\ -_08026E10: .4byte gMoveResultFlags\n\ -_08026E14: .4byte gBankAttacker\n\ -_08026E18: .4byte gBankTarget\n\ -_08026E1C: .4byte gBattleCommunication\n\ -_08026E20:\n\ - ldr r1, _08026E50 @ =gBattleCommunication\n\ - movs r0, 0x1\n\ -_08026E24:\n\ - strb r0, [r1, 0x5]\n\ - ldr r3, _08026E54 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_08026E40:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08026E50: .4byte gBattleCommunication\n\ -_08026E54: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif // NOTMATCHING - -static void atk94_damagetohalftargethp(void) //super fang -{ - gBattleMoveDamage = gBattleMons[gBankTarget].hp / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr++; -} - -static void atk95_setsandstorm(void) -{ - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_SANDSTORM_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atk96_weatherdamage(void) -{ - if (WEATHER_HAS_EFFECT) - { - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - { - if (gBattleMons[gBankAttacker].type1 != TYPE_ROCK && gBattleMons[gBankAttacker].type1 != TYPE_STEEL && gBattleMons[gBankAttacker].type1 != TYPE_GROUND - && gBattleMons[gBankAttacker].type2 != TYPE_ROCK && gBattleMons[gBankAttacker].type2 != TYPE_STEEL && gBattleMons[gBankAttacker].type2 != TYPE_GROUND - && gBattleMons[gBankAttacker].ability != ABILITY_SAND_VEIL && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER)) - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else - { - gBattleMoveDamage = 0; - } - } - if (gBattleWeather & WEATHER_HAIL) - { - if (gBattleMons[gBankAttacker].type1 != TYPE_ICE && gBattleMons[gBankAttacker].type2 != TYPE_ICE && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER)) - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else - { - gBattleMoveDamage = 0; - } - } - } - else - gBattleMoveDamage = 0; - - if (gAbsentBattlerFlags & gBitTable[gBankAttacker]) - gBattleMoveDamage = 0; - - gBattlescriptCurrInstr++; -} - -static void atk97_tryinfatuating(void) -{ - struct Pokemon *attacker, *target; - u16 atk_species, def_species; - u32 atk_pid, def_pid; - if (!GetBattlerSide(gBankAttacker)) - attacker = &gPlayerParty[gBattlerPartyIndexes[gBankAttacker]]; - else - attacker = &gEnemyParty[gBattlerPartyIndexes[gBankAttacker]]; - - if (!GetBattlerSide(gBankTarget)) - target = &gPlayerParty[gBattlerPartyIndexes[gBankTarget]]; - else - target = &gEnemyParty[gBattlerPartyIndexes[gBankTarget]]; - - atk_species = GetMonData(attacker, MON_DATA_SPECIES); - atk_pid = GetMonData(attacker, MON_DATA_PERSONALITY); - - def_species = GetMonData(target, MON_DATA_SPECIES); - def_pid = GetMonData(target, MON_DATA_PERSONALITY); - - if (gBattleMons[gBankTarget].ability == ABILITY_OBLIVIOUS) - { - gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction; - gLastUsedAbility = ABILITY_OBLIVIOUS; - RecordAbilityBattle(gBankTarget, ABILITY_OBLIVIOUS); - } - else - { - if (GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == GetGenderFromSpeciesAndPersonality(def_species, def_pid) - || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE || gBattleMons[gBankTarget].status2 & STATUS2_INFATUATION || GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == 0xFF - || GetGenderFromSpeciesAndPersonality(def_species, def_pid) == 0xFF) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMons[gBankTarget].status2 |= (gBitTable[gBankAttacker] << 16); - gBattlescriptCurrInstr += 5; - } - } -} - -static void atk98_updatestatusicon(void) -{ - if (gBattleExecBuffer) - return; - - if (T2_READ_8(gBattlescriptCurrInstr + 1) != 4) - { - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 2; - } - else - { - gActiveBattler = gBankAttacker; - if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - { - EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); - MarkBufferBankForExecution(gActiveBattler); - } - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - { - EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); - MarkBufferBankForExecution(gActiveBattler); - } - } - gBattlescriptCurrInstr += 2; - } -} - -static void atk99_setmist(void) -{ - if (gSideTimers[GetBattlerPosition(gBankAttacker) & 1].mistTimer) - { - gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gSideTimers[GetBattlerPosition(gBankAttacker) & 1].mistTimer = 5; - gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_MIST; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk9A_setfocusenergy(void) -{ - if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) - { - gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMons[gBankAttacker].status2 |= STATUS2_FOCUS_ENERGY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk9B_transformdataexecution(void) -{ - gChosenMove = 0xFFFF; - gBattlescriptCurrInstr++; - if (gBattleMons[gBankTarget].status2 & STATUS2_TRANSFORMED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) - { - gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - u32 i; s32 j; - u8 *atk_data, *def_data; - gBattleMons[gBankAttacker].status2 |= STATUS2_TRANSFORMED; - gDisableStructs[gBankAttacker].disabledMove = 0; - gDisableStructs[gBankAttacker].disableTimer1 = 0; - gDisableStructs[gBankAttacker].transformedMonPersonality = gBattleMons[gBankTarget].personality; - gDisableStructs[gBankAttacker].unk18_b = 0; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 6; - gBattleTextBuff1[2] = (gBattleMons[gBankTarget].species); - gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].species); - gBattleTextBuff1[4] = 0xFF; - - atk_data = (u8*)(&gBattleMons[gBankAttacker]); - def_data = (u8*)(&gBattleMons[gBankTarget]); - - for (i = 0; i < 0x24; i++) - atk_data[i] = def_data[i]; - - for (j = 0; j < 4; j++) - { - if (gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp < 5) - gBattleMons[gBankAttacker].pp[j] = gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp; - else - gBattleMons[gBankAttacker].pp[j] = 5; - } - - gActiveBattler = gBankAttacker; - EmitResetActionMoveSelection(0, 2); - MarkBufferBankForExecution(gActiveBattler); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } -} - -static void atk9C_setsubstitute(void) -{ - u32 hp = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMons[gBankAttacker].maxHP / 4 == 0) - hp = 1; - if (gBattleMons[gBankAttacker].hp <= hp) - { - gBattleMoveDamage = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMons[gBankAttacker].status2 |= STATUS2_SUBSTITUTE; - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED); - gDisableStructs[gBankAttacker].substituteHP = gBattleMoveDamage; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; - } - gBattlescriptCurrInstr++; -} - -static bool8 IsMoveUncopyable(u16 move) -{ - int i; - for (i = 0; sMovesForbiddenToCopy[i] != 0xFFFE && sMovesForbiddenToCopy[i] != move; i++) {} - return (sMovesForbiddenToCopy[i] != 0xFFFE); -} - -static void atk9D_mimicattackcopy(void) -{ - gChosenMove = 0xFFFF; - if (IsMoveUncopyable(gLastUsedMove[gBankTarget]) || gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED - || gLastUsedMove[gBankTarget] == 0 || gLastUsedMove[gBankTarget] == 0xFFFF) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (i == 4) - { - gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastUsedMove[gBankTarget]; - if (gBattleMoves[gLastUsedMove[gBankTarget]].pp < 5) - gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastUsedMove[gBankTarget]].pp; - else - gBattleMons[gBankAttacker].pp[gCurrMovePos] = 5; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gLastUsedMove[gBankTarget]; - gBattleTextBuff1[3] = uBYTE1_16(gLastUsedMove[gBankTarget]); - gBattleTextBuff1[4] = 0xFF; - - gDisableStructs[gBankAttacker].unk18_b |= gBitTable[gCurrMovePos]; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -#if DEBUG -NAKED -static void atk9E_metronome(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - ldr r6, ._3076 @ gBankAttacker\n\ - ldrb r2, [r6]\n\ - lsl r1, r2, #0x1\n\ - ldr r0, ._3076 + 4 @ \n\ - add r3, r1, r0\n\ - ldr r5, ._3076 + 8 @ \n\ - mov r4, #0x58\n\ - add r0, r2, #0\n\ - mul r0, r0, r4\n\ - add r1, r0, r5\n\ - ldrh r0, [r1, #0xe]\n\ - cmp r0, #0\n\ - bne ._3071 @cond_branch\n\ - ldrh r2, [r1, #0x10]\n\ - cmp r2, #0\n\ - beq ._3071 @cond_branch\n\ - ldrh r0, [r1, #0x12]\n\ - cmp r0, #0\n\ - beq ._3071 @cond_branch\n\ - ldrh r0, [r3]\n\ - cmp r0, #0\n\ - bne ._3072 @cond_branch\n\ - strh r2, [r3]\n\ -._3072:\n\ - ldr r1, ._3076 + 12 @ \n\ - ldrh r0, [r3]\n\ - strh r0, [r1]\n\ - ldrb r0, [r6]\n\ - mul r0, r0, r4\n\ - add r0, r0, r5\n\ - ldrh r5, [r0, #0x10]\n\ - ldrh r2, [r0, #0x12]\n\ - add r7, r1, #0\n\ - cmp r5, r2\n\ - bcs ._3073 @cond_branch\n\ - ldrh r0, [r3]\n\ - cmp r0, r2\n\ - beq ._3074 @cond_branch\n\ - add r0, r0, #0x1\n\ - b ._3079\n\ -._3077:\n\ - .align 2, 0\n\ -._3076:\n\ - .word gBankAttacker\n\ - .word +0x20160b4\n\ - .word gBattleMons\n\ - .word gCurrentMove\n\ -._3073:\n\ - ldrh r4, [r3]\n\ - add r1, r4, #0\n\ - mov r0, #0xb1\n\ - lsl r0, r0, #0x1\n\ - cmp r1, r0\n\ - bne ._3078 @cond_branch\n\ - mov r0, #0x1\n\ - b ._3079\n\ -._3078:\n\ - cmp r1, r2\n\ - bne ._3080 @cond_branch\n\ -._3074:\n\ - strh r5, [r3]\n\ - b ._3081\n\ -._3080:\n\ - add r0, r4, #1\n\ -._3079:\n\ - strh r0, [r3]\n\ -._3081:\n\ - ldr r4, ._3083 @ gHitMarker\n\ - ldr r2, [r4]\n\ - ldr r0, ._3083 + 4 @ 0xfffffbff\n\ - and r2, r2, r0\n\ - str r2, [r4]\n\ - ldr r6, ._3083 + 8 @ gBattlescriptCurrInstr\n\ - ldr r5, ._3083 + 12 @ gBattleScriptsForMoveEffects\n\ - ldr r3, ._3083 + 16 @ gBattleMoves\n\ - ldrh r1, [r7]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r3\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r5\n\ - ldr r0, [r0]\n\ - str r0, [r6]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x4\n\ - orr r2, r2, r0\n\ - str r2, [r4]\n\ - ldrh r0, [r7]\n\ - b ._3082\n\ -._3084:\n\ - .align 2, 0\n\ -._3083:\n\ - .word gHitMarker\n\ - .word 0xfffffbff\n\ - .word gBattlescriptCurrInstr\n\ - .word gBattleScriptsForMoveEffects\n\ - .word gBattleMoves\n\ -._3071:\n\ - ldr r7, ._3090 @ gCurrentMove\n\ - mov r6, #0xb1\n\ - lsl r6, r6, #0x1\n\ - ldr r5, ._3090 + 4 @ sMovesForbiddenToCopy\n\ - ldr r0, ._3090 + 8 @ gBattlescriptCurrInstr\n\ - mov r8, r0\n\ -._3089:\n\ - bl Random\n\ - ldr r2, ._3090 + 12 @ 0x1ff\n\ - add r1, r2, #0\n\ - and r0, r0, r1\n\ - add r0, r0, #0x1\n\ - strh r0, [r7]\n\ - cmp r0, r6\n\ - bhi ._3089 @cond_branch\n\ - mov r0, #0x3\n\ -._3086:\n\ - sub r0, r0, #0x1\n\ - cmp r0, #0\n\ - bge ._3086 @cond_branch\n\ - ldr r4, ._3090 @ gCurrentMove\n\ - ldrh r2, [r4]\n\ - ldr r3, ._3090 + 16 @ 0xffff\n\ - sub r0, r5, #2\n\ -._3088:\n\ - add r0, r0, #0x2\n\ - ldrh r1, [r0]\n\ - cmp r1, r2\n\ - beq ._3087 @cond_branch\n\ - cmp r1, r3\n\ - bne ._3088 @cond_branch\n\ -._3087:\n\ - ldr r0, ._3090 + 16 @ 0xffff\n\ - cmp r1, r0\n\ - bne ._3089 @cond_branch\n\ - ldr r2, ._3090 + 20 @ gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, ._3090 + 24 @ 0xfffffbff\n\ - and r0, r0, r1\n\ - str r0, [r2]\n\ - ldr r3, ._3090 + 28 @ gBattleScriptsForMoveEffects\n\ - ldr r2, ._3090 + 32 @ gBattleMoves\n\ - ldrh r1, [r4]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r2\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r3\n\ - ldr r0, [r0]\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - ldrh r0, [r4]\n\ -._3082:\n\ - mov r1, #0x0\n\ - bl GetMoveTarget\n\ - ldr r1, ._3090 + 36 @ gBankTarget\n\ - strb r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._3091:\n\ - .align 2, 0\n\ -._3090:\n\ - .word gCurrentMove\n\ - .word sMovesForbiddenToCopy\n\ - .word gBattlescriptCurrInstr\n\ - .word 0x1ff\n\ - .word 0xffff\n\ - .word gHitMarker\n\ - .word 0xfffffbff\n\ - .word gBattleScriptsForMoveEffects\n\ - .word gBattleMoves\n\ - .word gBankTarget"); -} -#else -#ifdef NONMATCHING -static void atk9E_metronome(void) -{ - // sMovesForbiddenToCopy - int i; - do - { - while ((gCurrentMove = (Random() & 0x1FF) + 1) > 0x162); - for (i = 0; sMovesForbiddenToCopy[i] != gCurrentMove && sMovesForbiddenToCopy[i] != 0xFFFF; i++); - } while (sMovesForbiddenToCopy[i] != 0xFFFF); - - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - gBankTarget = GetMoveTarget(gCurrentMove, 0); -} - -#else -NAKED -static void atk9E_metronome(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - ldr r7, _08027938 @ =gCurrentMove\n\ - movs r6, 0xB1\n\ - lsls r6, 1\n\ - ldr r5, _0802793C @ =sMovesForbiddenToCopy\n\ - ldr r0, _08027940 @ =gBattlescriptCurrInstr\n\ - mov r8, r0\n\ -_080278CA:\n\ - bl Random\n\ - ldr r2, _08027944 @ =0x000001ff\n\ - adds r1, r2, 0\n\ - ands r0, r1\n\ - adds r0, 0x1\n\ - strh r0, [r7]\n\ - cmp r0, r6\n\ - bhi _080278CA\n\ - movs r0, 0x3\n\ -_080278DE:\n\ - subs r0, 0x1\n\ - cmp r0, 0\n\ - bge _080278DE\n\ - ldr r4, _08027938 @ =gCurrentMove\n\ - ldrh r2, [r4]\n\ - ldr r3, _08027948 @ =0x0000ffff\n\ - subs r0, r5, 0x2\n\ -_080278EC:\n\ - adds r0, 0x2\n\ - ldrh r1, [r0]\n\ - cmp r1, r2\n\ - beq _080278F8\n\ - cmp r1, r3\n\ - bne _080278EC\n\ -_080278F8:\n\ - ldr r0, _08027948 @ =0x0000ffff\n\ - cmp r1, r0\n\ - bne _080278CA\n\ - ldr r2, _0802794C @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _08027950 @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08027954 @ =gBattleScriptsForMoveEffects\n\ - ldr r2, _08027958 @ =gBattleMoves\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl GetMoveTarget\n\ - ldr r1, _0802795C @ =gBankTarget\n\ - strb r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08027938: .4byte gCurrentMove\n\ -_0802793C: .4byte sMovesForbiddenToCopy\n\ -_08027940: .4byte gBattlescriptCurrInstr\n\ -_08027944: .4byte 0x000001ff\n\ -_08027948: .4byte 0x0000ffff\n\ -_0802794C: .4byte gHitMarker\n\ -_08027950: .4byte 0xfffffbff\n\ -_08027954: .4byte gBattleScriptsForMoveEffects\n\ -_08027958: .4byte gBattleMoves\n\ -_0802795C: .4byte gBankTarget\n\ - .syntax divided"); -} -#endif // NONMATCHING -#endif - -static void atk9F_dmgtolevel(void) -{ - gBattleMoveDamage = gBattleMons[gBankAttacker].level; - gBattlescriptCurrInstr++; -} - -static void atkA0_psywavedamageeffect(void) -{ - s32 rand_dmg; - while ((rand_dmg = (Random() & 0xF)) > 0xA); - rand_dmg *= 10; - gBattleMoveDamage = gBattleMons[gBankAttacker].level * (rand_dmg + 50) / 100; - gBattlescriptCurrInstr++; -} - -static void atkA1_counterdamagecalculator(void) -{ - u8 atk_side = GetBattlerSide(gBankAttacker); - u8 def_side = GetBattlerSide(gProtectStructs[gBankAttacker].physicalBank); - if (gProtectStructs[gBankAttacker].physicalDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp) - { - gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2; - if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp) - gBankTarget = gSideTimers[def_side].followmeTarget; - else - gBankTarget = gProtectStructs[gBankAttacker].physicalBank; - gBattlescriptCurrInstr += 5; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the physical -> special field changes -{ - u8 atk_side = GetBattlerSide(gBankAttacker); - u8 def_side = GetBattlerSide(gProtectStructs[gBankAttacker].specialBank); - if (gProtectStructs[gBankAttacker].specialDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp) - { - gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2; - if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp) - gBankTarget = gSideTimers[def_side].followmeTarget; - else - gBankTarget = gProtectStructs[gBankAttacker].specialBank; - gBattlescriptCurrInstr += 5; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkA3_disablelastusedattack(void) -{ - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (gDisableStructs[gBankTarget].disabledMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gBattleMons[gBankTarget].moves[i]; - gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].moves[i]); - gBattleTextBuff1[4] = 0xFF; - - gDisableStructs[gBankTarget].disabledMove = gBattleMons[gBankTarget].moves[i]; - gDisableStructs[gBankTarget].disableTimer1 = (Random() & 3) + 2; - gDisableStructs[gBankTarget].disableTimer2 = gDisableStructs[gBankTarget].disableTimer1; //that's interesting - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkA4_trysetencore(void) -{ - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (gLastUsedMove[gBankTarget] == MOVE_STRUGGLE || gLastUsedMove[gBankTarget] == MOVE_ENCORE || gLastUsedMove[gBankTarget] == MOVE_MIRROR_MOVE) - i = 4; - if (gDisableStructs[gBankTarget].encoredMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0) - { - gDisableStructs[gBankTarget].encoredMove = gBattleMons[gBankTarget].moves[i]; - gDisableStructs[gBankTarget].encoredMovePos = i; - gDisableStructs[gBankTarget].encoreTimer1 = (Random() & 3) + 3; - gDisableStructs[gBankTarget].encoreTimer2 = gDisableStructs[gBankTarget].encoreTimer1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkA5_painsplitdmgcalc(void) -{ - if (!(gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)) - { - s32 hp_diff = (gBattleMons[gBankAttacker].hp + gBattleMons[gBankTarget].hp) / 2; - s32 to_store = gBattleMoveDamage = gBattleMons[gBankTarget].hp - hp_diff; - gBattleStruct->unk16014 = sBYTE0_32(to_store); - gBattleStruct->unk16015 = sBYTE1_32(to_store); - gBattleStruct->unk16016 = sBYTE2_32(to_store); - gBattleStruct->unk16017 = sBYTE3_32(to_store); - - gBattleMoveDamage = gBattleMons[gBankAttacker].hp - hp_diff; - gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; - - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#ifdef NONMATCHING -static void atkA6_settypetorandomresistance(void) -{ - if (gLastLandedMoves[gBankAttacker] == 0 || gLastLandedMoves[gBankAttacker] == 0xFFFF || (IsTwoTurnsMove(gLastLandedMoves[gBankAttacker]) && !gProtectStructs[gBankAttacker].physicalDmg && !gProtectStructs[gBankAttacker].specialDmg)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - int type = 0, rands = 0; - do - { - while (((type = (Random() & 0x7F)) > 0x70)); - type *= 3; - if (gTypeEffectiveness[type] == gLastHitByType[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) - { - gBattleMons[gBankAttacker].type1 = type; - gBattleMons[gBankAttacker].type2 = type; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = type; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - return; - } - rands++; - } while (rands <= 999); - - type = 0, rands = 0; - do - { - if (gTypeEffectiveness[type] == 0xFE || gTypeEffectiveness[type] != 0xFF) - { - if (gTypeEffectiveness[type] == gLastHitByType[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) - { - gBattleMons[gBankAttacker].type1 = gTypeEffectiveness[rands + 1]; - gBattleMons[gBankAttacker].type2 = gTypeEffectiveness[rands + 1]; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = gTypeEffectiveness[rands + 1]; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - return; - } - } - type += 3, rands += 3; - } while (rands < 336); - - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -#else -NAKED -static void atkA6_settypetorandomresistance(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r1, _08027FA8 @ =gLastLandedMoves\n\ - ldr r4, _08027FAC @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r2, r0, r1\n\ - ldrh r1, [r2]\n\ - cmp r1, 0\n\ - beq _08027F8C\n\ - ldr r0, _08027FB0 @ =0x0000ffff\n\ - cmp r1, r0\n\ - beq _08027F8C\n\ - ldrh r0, [r2]\n\ - bl IsTwoTurnsMove\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08028024\n\ - ldr r2, _08027FB4 @ =gProtectStructs\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 4\n\ - adds r0, r2, 0x4\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08028024\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08028024\n\ -_08027F8C:\n\ - ldr r3, _08027FB8 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ - b _08028110\n\ - .align 2, 0\n\ -_08027FA8: .4byte gLastLandedMoves\n\ -_08027FAC: .4byte gBankAttacker\n\ -_08027FB0: .4byte 0x0000ffff\n\ -_08027FB4: .4byte gProtectStructs\n\ -_08027FB8: .4byte gBattlescriptCurrInstr\n\ -_08027FBC:\n\ - mov r0, r12\n\ - strb r5, [r0]\n\ - mov r1, r10\n\ - ldrb r0, [r1]\n\ - muls r0, r2\n\ - adds r0, r7\n\ - adds r0, 0x22\n\ - strb r5, [r0]\n\ - ldr r1, _08027FE0 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x3\n\ - strb r0, [r1, 0x1]\n\ - strb r5, [r1, 0x2]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - ldr r1, _08027FE4 @ =gBattlescriptCurrInstr\n\ - b _08028012\n\ - .align 2, 0\n\ -_08027FE0: .4byte gBattleTextBuff1\n\ -_08027FE4: .4byte gBattlescriptCurrInstr\n\ -_08027FE8:\n\ - mov r0, r8\n\ - adds r0, 0x1\n\ - adds r0, r3\n\ - ldrb r2, [r0]\n\ - strb r2, [r4]\n\ - mov r4, r10\n\ - ldrb r0, [r4]\n\ - muls r0, r6\n\ - ldr r7, _0802801C @ =gBattleMons\n\ - adds r0, r7\n\ - adds r0, 0x22\n\ - strb r2, [r0]\n\ - ldr r1, _08028020 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x3\n\ - strb r0, [r1, 0x1]\n\ - strb r2, [r1, 0x2]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - mov r1, r12\n\ -_08028012:\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _08028110\n\ - .align 2, 0\n\ -_0802801C: .4byte gBattleMons\n\ -_08028020: .4byte gBattleTextBuff1\n\ -_08028024:\n\ - movs r4, 0\n\ - mov r8, r4\n\ - movs r7, 0x7F\n\ - mov r9, r7\n\ -_0802802C:\n\ - bl Random\n\ - mov r4, r9\n\ - ands r4, r0\n\ - cmp r4, 0x70\n\ - bhi _0802802C\n\ - lsls r0, r4, 1\n\ - adds r4, r0, r4\n\ - ldr r6, _08028120 @ =gTypeEffectiveness\n\ - adds r3, r4, r6\n\ - ldr r1, _08028124 @ =gLastHitByType\n\ - ldr r2, _08028128 @ =gBankAttacker\n\ - ldrb r5, [r2]\n\ - lsls r0, r5, 1\n\ - adds r0, r1\n\ - ldrb r1, [r3]\n\ - mov r10, r2\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bne _08028088\n\ - adds r0, r4, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x5\n\ - bhi _08028088\n\ - ldr r7, _0802812C @ =gBattleMons\n\ - movs r2, 0x58\n\ - adds r0, r5, 0\n\ - muls r0, r2\n\ - adds r3, r0, r7\n\ - movs r0, 0x21\n\ - adds r0, r3\n\ - mov r12, r0\n\ - adds r0, r4, 0x1\n\ - adds r0, r6\n\ - ldrb r5, [r0]\n\ - mov r1, r12\n\ - ldrb r0, [r1]\n\ - adds r1, r5, 0\n\ - cmp r0, r1\n\ - beq _08028088\n\ - adds r0, r3, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - bne _08027FBC\n\ -_08028088:\n\ - movs r7, 0x1\n\ - add r8, r7\n\ - ldr r0, _08028130 @ =0x000003e7\n\ - cmp r8, r0\n\ - ble _0802802C\n\ - movs r0, 0\n\ - mov r8, r0\n\ - ldr r1, _08028134 @ =gBattlescriptCurrInstr\n\ - mov r12, r1\n\ - ldr r3, _08028120 @ =gTypeEffectiveness\n\ - adds r0, r4, 0x1\n\ - adds r0, r3\n\ - mov r9, r0\n\ - adds r5, r3, 0\n\ -_080280A4:\n\ - ldrb r1, [r5]\n\ - cmp r1, 0xFF\n\ - bgt _080280AE\n\ - cmp r1, 0xFE\n\ - bge _080280E8\n\ -_080280AE:\n\ - mov r4, r10\n\ - ldrb r2, [r4]\n\ - lsls r0, r2, 1\n\ - ldr r7, _08028124 @ =gLastHitByType\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bne _080280E8\n\ - ldrb r0, [r5, 0x2]\n\ - cmp r0, 0x5\n\ - bhi _080280E8\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - ldr r1, _0802812C @ =gBattleMons\n\ - adds r2, r0, r1\n\ - adds r4, r2, 0\n\ - adds r4, 0x21\n\ - ldrb r0, [r4]\n\ - mov r7, r9\n\ - ldrb r1, [r7]\n\ - cmp r0, r1\n\ - beq _080280E8\n\ - adds r0, r2, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - beq _080280E8\n\ - b _08027FE8\n\ -_080280E8:\n\ - adds r5, 0x3\n\ - movs r0, 0x3\n\ - add r8, r0\n\ - ldr r0, _08028138 @ =0x0000014f\n\ - cmp r8, r0\n\ - bls _080280A4\n\ - mov r1, r12\n\ - ldr r2, [r1]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - mov r4, r12\n\ - str r1, [r4]\n\ -_08028110:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08028120: .4byte gTypeEffectiveness\n\ -_08028124: .4byte gLastHitByType\n\ -_08028128: .4byte gBankAttacker\n\ -_0802812C: .4byte gBattleMons\n\ -_08028130: .4byte 0x000003e7\n\ -_08028134: .4byte gBattlescriptCurrInstr\n\ -_08028138: .4byte 0x0000014f\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkA7_setalwayshitflag(void) -{ - gStatuses3[gBankTarget] &= ~(STATUS3_ALWAYS_HITS); - gStatuses3[gBankTarget] |= 0x10; - gDisableStructs[gBankTarget].bankWithSureHit = gBankAttacker; - gBattlescriptCurrInstr++; -} - -struct move_pp -{ - u16 move[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -static void atkA8_copymovepermanently(void) -{ - gChosenMove = 0xFFFF; - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) && gUnknown_02024C2C[gBankTarget] != MOVE_STRUGGLE && gUnknown_02024C2C[gBankTarget] != 0 && gUnknown_02024C2C[gBankTarget] != 0xFFFF && gUnknown_02024C2C[gBankTarget] != MOVE_SKETCH) - { - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == MOVE_SKETCH) - continue; - if (gBattleMons[gBankAttacker].moves[i] == gUnknown_02024C2C[gBankTarget]) - break; - } - if (i != 4) //sketch fail - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else //sketch worked - { - struct move_pp moves_data; - gBattleMons[gBankAttacker].moves[gCurrMovePos] = gUnknown_02024C2C[gBankTarget]; - gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gUnknown_02024C2C[gBankTarget]].pp; - gActiveBattler = gBankAttacker; - for (i = 0; i < 4; i++) - { - moves_data.move[i] = gBattleMons[gBankAttacker].moves[i]; - moves_data.pp[i] = gBattleMons[gBankAttacker].pp[i]; - } - moves_data.ppBonuses = gBattleMons[gBankAttacker].ppBonuses; - EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data); - MarkBufferBankForExecution(gActiveBattler); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gUnknown_02024C2C[gBankTarget]; - gBattleTextBuff1[3] = gUnknown_02024C2C[gBankTarget] >> 8; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr += 5; - } - } - else //sketch fail - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static bool8 IsTwoTurnsMove(u16 move) -{ - u8 effect = gBattleMoves[move].effect; - if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE) - return 1; - else - return 0; -} - -static bool8 IsMoveUnchoosable(u16 move) -{ - if (move == 0 || move == MOVE_SLEEP_TALK || move == MOVE_ASSIST || move == MOVE_MIRROR_MOVE || move == MOVE_METRONOME) - return 1; - else - return 0; -} - -static u8 AttacksThisTurn(u8 bank, u16 move) //Note: returns 1 if it's a charging turn, otherwise 2 -{ - //first argument is unused - u8 effect; - if (gBattleMoves[move].effect == EFFECT_SOLARBEAM && (gBattleWeather & WEATHER_SUN_ANY)) - return 2; - effect = gBattleMoves[move].effect; - if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE) - { - if ((gHitMarker & HITMARKER_x8000000)) - return 1; - } - return 2; -} - -static void atkA9_trychoosesleeptalkmove(void) -{ - u8 unusable_moves = 0; - int i; - - for (i = 0; i < 4; i++) - { - if (IsMoveUnchoosable(gBattleMons[gBankAttacker].moves[i]) || gBattleMons[gBankAttacker].moves[i] == MOVE_FOCUS_PUNCH - || gBattleMons[gBankAttacker].moves[i] == MOVE_UPROAR || IsTwoTurnsMove(gBattleMons[gBankAttacker].moves[i])) - unusable_moves |= gBitTable[i]; - } - unusable_moves = CheckMoveLimitations(gBankAttacker, unusable_moves, 0xFD); - if (unusable_moves == 0xF) //all 4 moves cannot be chosen - gBattlescriptCurrInstr += 5; - else //at least one move can be chosen - { - u32 random_pos; - do - { - random_pos = Random() & 3; - } while ((gBitTable[random_pos] & unusable_moves)); - - gRandomMove = gBattleMons[gBankAttacker].moves[random_pos]; - gCurrMovePos = random_pos; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBankTarget = GetMoveTarget(gRandomMove, 0); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkAA_setdestinybond(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_DESTINY_BOND; - gBattlescriptCurrInstr++; -} - -static void TrySetDestinyBondToHappen(void) -{ - u8 atk_side = GetBattlerSide(gBankAttacker); - u8 def_side = GetBattlerSide(gBankTarget); - if (gBattleMons[gBankTarget].status2 & STATUS2_DESTINY_BOND && atk_side != def_side && !(gHitMarker & HITMARKER_GRUDGE)) - gHitMarker |= HITMARKER_DESTINYBOND; -} - -static void atkAB_trysetdestinybondtohappen(void) -{ - TrySetDestinyBondToHappen(); - gBattlescriptCurrInstr++; -} - -static void atkAC_remaininghptopower(void) -{ - s32 hp_fraction = GetScaledHPFraction(gBattleMons[gBankAttacker].hp, gBattleMons[gBankAttacker].maxHP, 48); - int i; - for (i = 0; i < 12; i += 2) - { - if (hp_fraction <= sFlailHpScaleToPowerTable[i]) - break; - } - gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1]; - gBattlescriptCurrInstr++; -} - -static void atkAD_tryspiteppreduce(void) -{ - if (gLastUsedMove[gBankTarget] != 0 && gLastUsedMove[gBankTarget] != 0xFFFF && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)) - { - int i; - for (i = 0; i < 4; i++) - { - if (gLastUsedMove[gBankTarget] == gBattleMons[gBankTarget].moves[i]) - break; - } - if (i != 4 && gBattleMons[gBankTarget].pp[i] > 1) - { - s32 lost_pp = (Random() & 3) + 2; - if (gBattleMons[gBankTarget].pp[i] < lost_pp) - lost_pp = gBattleMons[gBankTarget].pp[i]; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gLastUsedMove[gBankTarget]; - gBattleTextBuff1[3] = gLastUsedMove[gBankTarget] >> 8; - gBattleTextBuff1[4] = 0xFF; - ConvertIntToDecimalStringN(gBattleTextBuff2, lost_pp, 0, 1); - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 1; - gBattleTextBuff2[2] = 1; - gBattleTextBuff2[3] = 1; - gBattleTextBuff2[4] = lost_pp; - gBattleTextBuff2[5] = 0xFF; - - gBattleMons[gBankTarget].pp[i] -= lost_pp; - gActiveBattler = gBankTarget; - if (!(gDisableStructs[gActiveBattler].unk18_b & gBitTable[i]) - && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) - { - EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]); - MarkBufferBankForExecution(gActiveBattler); - } - gBattlescriptCurrInstr += 5; - if (gBattleMons[gBankTarget].pp[i] == 0) - CancelMultiTurnMoves(gBankTarget); - return; - } - } - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkAE_healpartystatus(void) -{ - register u32 zero2 asm("r4") = 0; - u32 zero = zero2; - u8 to_heal = 0; - if (gCurrentMove == MOVE_HEAL_BELL) - { - struct Pokemon* party; - int i; - - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (GetBattlerSide(gBankAttacker) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gBankAttacker].status1 = 0; - } - else - { - RecordAbilityBattle(gBankAttacker, gBattleMons[gBankAttacker].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 1; - } - - gActiveBattler = gBattleStruct->scriptingActive = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - { - if (gBattleMons[gActiveBattler].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gActiveBattler].status1 = 0; - } - else - { - RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 2; - } - } - - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES2); - u8 abilityBit = GetMonData(&party[i], MON_DATA_ALT_ABILITY); - if (species != 0 && species != SPECIES_EGG) - { - u8 ability; - if (gBattlerPartyIndexes[gBankAttacker] == i) - ability = gBattleMons[gBankAttacker].ability; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[gActiveBattler] == i && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - ability = gBattleMons[gActiveBattler].ability; - else - ability = GetAbilityBySpecies(species, abilityBit); - if (ability != ABILITY_SOUNDPROOF) - to_heal |= (1 << i); - } - } - } - else //Aromatherapy - { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - to_heal = 0x3F; - gBattleMons[gBankAttacker].status1 = zero2; - - gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) - gBattleMons[gActiveBattler].status1 = 0; - - } - //missing check? - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero); - MarkBufferBankForExecution(gActiveBattler); - - gBattlescriptCurrInstr++; -} - -static void atkAF_cursetarget(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_CURSED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMons[gBankTarget].status2 |= STATUS2_CURSED; - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkB0_trysetspikes(void) -{ - u8 side = GetBattlerSide(gBankAttacker) ^ 1; - if (gSideTimers[side].spikesAmount == 3) - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gSideAffecting[side] |= SIDE_STATUS_SPIKES; - gSideTimers[side].spikesAmount++; - gBattlescriptCurrInstr += 5; - } -} - -static void atkB1_setforesight(void) -{ - gBattleMons[gBankTarget].status2 |= STATUS2_FORESIGHT; - gBattlescriptCurrInstr++; -} - -static void atkB2_trysetperishsong(void) -{ - int not_affected_pokes = 0, i; - - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses3[i] & STATUS3_PERISH_SONG || gBattleMons[i].ability == ABILITY_SOUNDPROOF) - not_affected_pokes++; - else - { - gStatuses3[i] |= STATUS3_PERISH_SONG; - gDisableStructs[i].perishSongTimer1 = 3; - gDisableStructs[i].perishSongTimer2 = 3; - } - } - - PressurePPLoseOnUsingPerishSong(gBankAttacker); - if (not_affected_pokes == gBattlersCount) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atkB3_rolloutdamagecalculation(void) -{ - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - { - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_MoveMissedPause; - } - else - { - int i; - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) //first hit - { - gDisableStructs[gBankAttacker].rolloutTimer1 = 5; - gDisableStructs[gBankAttacker].rolloutTimer2 = 5; - gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gBankAttacker] = gCurrentMove; - } - if (--gDisableStructs[gBankAttacker].rolloutTimer1 == 0) - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); - - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - for (i = 1; i < (5 - gDisableStructs[gBankAttacker].rolloutTimer1); i++) - gDynamicBasePower *= 2; - - if (gBattleMons[gBankAttacker].status2 & STATUS2_DEFENSE_CURL) - gDynamicBasePower *= 2; - - gBattlescriptCurrInstr++; - } -} - -static void atkB4_jumpifconfusedandstatmaxed(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_CONFUSION && gBattleMons[gBankTarget].statStages[T2_READ_8(gBattlescriptCurrInstr + 1)] == 0xC) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atkB5_furycuttercalc(void) -{ - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - { - gDisableStructs[gBankAttacker].furyCutterCounter = 0; - gBattlescriptCurrInstr = BattleScript_MoveMissedPause; - } - else - { - int i; - - if (gDisableStructs[gBankAttacker].furyCutterCounter != 5) - gDisableStructs[gBankAttacker].furyCutterCounter++; - - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - for (i = 1; i < gDisableStructs[gBankAttacker].furyCutterCounter; i++) - gDynamicBasePower *= 2; - - gBattlescriptCurrInstr++; - } -} - -static void atkB6_happinesstodamagecalculation(void) -{ - if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN) - gDynamicBasePower = 10 * (gBattleMons[gBankAttacker].friendship) / 25; - else //EFFECT_FRUSTRATION - gDynamicBasePower = 10 * (255 - gBattleMons[gBankAttacker].friendship) / 25; - gBattlescriptCurrInstr++; -} - -static void atkB7_presentdamagecalculation(void) -{ - s32 rand = Random() & 0xFF; - if (rand < 102) - gDynamicBasePower = 40; - else if (rand < 178) - gDynamicBasePower = 80; - else if (rand < 204) - gDynamicBasePower = 120; - else - { - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - } - if (rand < 204) - gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; - else if (gBattleMons[gBankTarget].maxHP == gBattleMons[gBankTarget].hp) - gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; - else - { - //gMoveResultFlags &= ~(MOVE_RESULT_DOESNT_AFFECT_FOE); only in Emerald - gBattlescriptCurrInstr = BattleScript_PresentHealTarget; - } -} - -static void atkB8_setsafeguard(void) -{ - if (gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] & SIDE_STATUS_SAFEGUARD) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBattlerPosition(gBankAttacker) & 1] |= SIDE_STATUS_SAFEGUARD; - gSideTimers[GetBattlerPosition(gBankAttacker) & 1].safeguardTimer = 5; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkB9_magnitudedamagecalculation(void) -{ - s32 magnitude = Random() % 100; - if (magnitude < 5) - { - gDynamicBasePower = 10; - magnitude = 4; - } - else if (magnitude < 15) - { - gDynamicBasePower = 30; - magnitude = 5; - } - else if (magnitude < 35) - { - gDynamicBasePower = 50; - magnitude = 6; - } - else if (magnitude < 65) - { - gDynamicBasePower = 70; - magnitude = 7; - } - else if (magnitude < 85) - { - gDynamicBasePower = 90; - magnitude = 8; - } - else if (magnitude < 95) - { - gDynamicBasePower = 110; - magnitude = 9; - } - else - { - gDynamicBasePower = 150; - magnitude = 10; - } - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 2; - gBattleTextBuff1[4] = magnitude; - gBattleTextBuff1[5] = 0xFF; - - for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) //a valid target was found - break; - } - gBattlescriptCurrInstr++; -} - -static void atkBA_jumpifnopursuitswitchdmg(void) -{ - if (gMultiHitCounter == 1) - { - if (GetBattlerSide(gBankAttacker) == 0) - gBankTarget = GetBattlerAtPosition(1); - else - gBankTarget = GetBattlerAtPosition(0); - } - else - { - if (GetBattlerSide(gBankAttacker) == 0) - gBankTarget = GetBattlerAtPosition(3); - else - gBankTarget = GetBattlerAtPosition(2); - } - - if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram16010arr(gBankTarget) && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) - && gBattleMons[gBankAttacker].hp && !gDisableStructs[gBankTarget].truantCounter && gChosenMovesByBanks[gBankTarget] == MOVE_PURSUIT) - { - int i; - for (i = 0; i < gBattlersCount; i++) - { - if (gBanksByTurnOrder[i] == gBankTarget) - gActionsByTurnOrder[i] = 11; - } - gCurrentMove = MOVE_PURSUIT; - gBattlescriptCurrInstr += 5; - gBattleStruct->animTurn = 1; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkBB_setsunny(void) -{ - if (gBattleWeather & WEATHER_SUN_ANY) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_SUN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkBC_maxattackhalvehp(void) //belly drum -{ - u32 half_hp = gBattleMons[gBankAttacker].maxHP / 2; - if (!(gBattleMons[gBankAttacker].maxHP / 2)) - half_hp = 1; - - if (gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] < 12 && gBattleMons[gBankAttacker].hp > half_hp) - { - gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] = 12; - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkBD_copyfoestats(void) //psych up -{ - int i; - for (i = 0; i < 8; i++) - { - gBattleMons[gBankAttacker].statStages[i] = gBattleMons[gBankTarget].statStages[i]; - } - gBattlescriptCurrInstr += 5; //why not 1? possible unused fail possibility? -} - -static void atkBE_rapidspinfree(void) //rapid spin -{ - if (gBattleMons[gBankAttacker].status2 & STATUS2_WRAPPED) - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED); - gBankTarget = ewram16020arr(gBankAttacker); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = ewram16004arr(0, gBankAttacker); - gBattleTextBuff1[3] = ewram16004arr(1, gBankAttacker); - gBattleTextBuff1[4] = 0xFF; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WrapFree; - } - else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED) - { - gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED); - gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_LeechSeedFree; - } - else if (gSideAffecting[GetBattlerSide(gBankAttacker)] & SIDE_STATUS_SPIKES) - { - gSideAffecting[GetBattlerSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES); - gSideTimers[GetBattlerSide(gBankAttacker)].spikesAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikesFree; - } - else - gBattlescriptCurrInstr++; -} - -static void atkBF_setdefensecurlbit(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_DEFENSE_CURL; - gBattlescriptCurrInstr++; -} - -static void atkC0_recoverbasedonsunlight(void) -{ - gBankTarget = gBankAttacker; - if (gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP) - { - if (!gBattleWeather || !WEATHER_HAS_EFFECT) - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - else if (gBattleWeather & WEATHER_SUN_ANY) - gBattleMoveDamage = 20 * gBattleMons[gBankAttacker].maxHP / 30; - else //not sunny weather - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkC1_hiddenpowercalc(void) -{ - u8 power = ((gBattleMons[gBankAttacker].hpIV & 2) >> 1) | - ((gBattleMons[gBankAttacker].attackIV & 2)) | - ((gBattleMons[gBankAttacker].defenseIV & 2) << 1) | - ((gBattleMons[gBankAttacker].speedIV & 2) << 2) | - ((gBattleMons[gBankAttacker].spAttackIV & 2) << 3) | - ((gBattleMons[gBankAttacker].spDefenseIV & 2) << 4); - u8 type = ((gBattleMons[gBankAttacker].hpIV & 1)) | - ((gBattleMons[gBankAttacker].attackIV & 1) << 1) | - ((gBattleMons[gBankAttacker].defenseIV & 1) << 2) | - ((gBattleMons[gBankAttacker].speedIV & 1) << 3) | - ((gBattleMons[gBankAttacker].spAttackIV & 1) << 4) | - ((gBattleMons[gBankAttacker].spDefenseIV & 1) << 5); - - gDynamicBasePower = 30 + (power * 40 / 63); - - gBattleStruct->dynamicMoveType = ((type * 15) / 63) + 1; - if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) - gBattleStruct->dynamicMoveType++; - - gBattleStruct->dynamicMoveType |= 0xC0; - - gBattlescriptCurrInstr++; -} - -static void atkC2_selectfirstvalidtarget(void) -{ - for (gBankTarget = 0; gBankTarget < gBattlersCount; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC3_trysetfutureattack(void) -{ - if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gWishFutureKnock.futureSightMove[gBankTarget] = gCurrentMove; - gWishFutureKnock.futureSightAttacker[gBankTarget] = gBankAttacker; - gWishFutureKnock.futureSightCounter[gBankTarget] = 3; - gWishFutureKnock.futureSightDmg[gBankTarget] = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - gSideAffecting[GetBattlerPosition(gBankTarget) & 1], 0, - 0, gBankAttacker, gBankTarget); - - if (gProtectStructs[gBankAttacker].helpingHand) - gWishFutureKnock.futureSightDmg[gBankTarget] = gWishFutureKnock.futureSightDmg[gBankTarget] * 15 / 10; - - if (gCurrentMove == MOVE_DOOM_DESIRE) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - - gBattlescriptCurrInstr += 5; - } -} - -#ifdef NONMATCHING -static void atkC4_trydobeatup(void) -{ - register struct Pokemon* party asm("r7"); - if (GetBattlerSide(gBankAttacker) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleMons[gBankTarget].hp == 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - while (gBattleCommunication[0] < 6) - { - if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) - break; - gBattleCommunication[0]++; - } - if (gBattleCommunication[0] < 6) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gBankAttacker; - gBattleTextBuff1[3] = gBattleCommunication[0]; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr += 9; - - gBattleMoveDamage = gBaseStats[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; - gBattleMoveDamage *= gBattleMoves[gCurrentMove].power; - gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); - gBattleMoveDamage /= gBaseStats[gBattleMons[gBankTarget].species].baseDefense; - gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - gBattleCommunication[0]++; - } - else if (gBattleCommunication[0] != 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); - } -} -#else -NAKED -static void atkC4_trydobeatup(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - ldr r0, _08029A8C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - ldr r7, _08029A90 @ =gEnemyParty\n\ - cmp r0, 0\n\ - bne _08029A62\n\ - ldr r7, _08029A94 @ =gPlayerParty\n\ -_08029A62:\n\ - ldr r2, _08029A98 @ =gBattleMons\n\ - ldr r0, _08029A9C @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08029AA4\n\ - ldr r3, _08029AA0 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029A8C: .4byte gBankAttacker\n\ -_08029A90: .4byte gEnemyParty\n\ -_08029A94: .4byte gPlayerParty\n\ -_08029A98: .4byte gBattleMons\n\ -_08029A9C: .4byte gBankTarget\n\ -_08029AA0: .4byte gBattlescriptCurrInstr\n\ -_08029AA4:\n\ - ldr r6, _08029BE0 @ =gBattleCommunication\n\ - ldrb r0, [r6]\n\ - mov r8, r0\n\ - cmp r0, 0x5\n\ - bls _08029AB0\n\ - b _08029C0C\n\ -_08029AB0:\n\ - adds r4, r6, 0\n\ - movs r5, 0x64\n\ -_08029AB4:\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r6]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x37\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029B08\n\ -_08029AF8:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, r4, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x5\n\ - bls _08029AB4\n\ -_08029B08:\n\ - ldr r1, _08029BE0 @ =gBattleCommunication\n\ - mov r9, r1\n\ - ldrb r2, [r1]\n\ - cmp r2, 0x5\n\ - bhi _08029C0C\n\ - ldr r1, _08029BE4 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r6, _08029BE8 @ =gBankAttacker\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - strb r2, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08029BEC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x9\n\ - str r0, [r1]\n\ - ldr r2, _08029BF0 @ =gBattleMoveDamage\n\ - mov r8, r2\n\ - ldr r5, _08029BF4 @ =gBaseStats\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - movs r4, 0x64\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r3, [r1, 0x1]\n\ - mov r2, r8\n\ - str r3, [r2]\n\ - ldr r2, _08029BF8 @ =gBattleMoves\n\ - ldr r0, _08029BFC @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x1]\n\ - muls r0, r3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - lsls r0, 1\n\ - movs r1, 0x5\n\ - bl __udivsi3\n\ - adds r0, 0x2\n\ - mov r2, r8\n\ - ldr r1, [r2]\n\ - muls r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08029C00 @ =gBattleMons\n\ - ldr r1, _08029C04 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - movs r1, 0x58\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 3\n\ - subs r1, r2\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r1, [r1, 0x2]\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - movs r1, 0x32\n\ - bl __divsi3\n\ - adds r2, r0, 0x2\n\ - mov r0, r8\n\ - str r2, [r0]\n\ - ldr r1, _08029C08 @ =gProtectStructs\n\ - ldrb r0, [r6]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08029BD4\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ -_08029BD4:\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - adds r0, 0x1\n\ - strb r0, [r2]\n\ - b _08029C46\n\ - .align 2, 0\n\ -_08029BE0: .4byte gBattleCommunication\n\ -_08029BE4: .4byte gBattleTextBuff1\n\ -_08029BE8: .4byte gBankAttacker\n\ -_08029BEC: .4byte gBattlescriptCurrInstr\n\ -_08029BF0: .4byte gBattleMoveDamage\n\ -_08029BF4: .4byte gBaseStats\n\ -_08029BF8: .4byte gBattleMoves\n\ -_08029BFC: .4byte gCurrentMove\n\ -_08029C00: .4byte gBattleMons\n\ -_08029C04: .4byte gBankTarget\n\ -_08029C08: .4byte gProtectStructs\n\ -_08029C0C:\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - beq _08029C2C\n\ - ldr r3, _08029C28 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029C28: .4byte gBattlescriptCurrInstr\n\ -_08029C2C:\n\ - ldr r3, _08029C54 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x5]\n\ - ldrb r0, [r2, 0x6]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x7]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x8]\n\ -_08029C40:\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_08029C46:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08029C54: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkC5_setsemiinvulnerablebit(void) -{ - switch (gCurrentMove) - { - case MOVE_FLY: - case MOVE_BOUNCE: - gStatuses3[gBankAttacker] |= STATUS3_ON_AIR; - break; - case MOVE_DIG: - gStatuses3[gBankAttacker] |= STATUS3_UNDERGROUND; - break; - case MOVE_DIVE: - gStatuses3[gBankAttacker] |= STATUS3_UNDERWATER; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC6_clearsemiinvulnerablebit(void) -{ - switch (gCurrentMove) - { - case MOVE_FLY: - case MOVE_BOUNCE: - gStatuses3[gBankAttacker] &= ~STATUS3_ON_AIR; - break; - case MOVE_DIG: - gStatuses3[gBankAttacker] &= ~STATUS3_UNDERGROUND; - break; - case MOVE_DIVE: - gStatuses3[gBankAttacker] &= ~STATUS3_UNDERWATER; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC7_setminimize(void) -{ - if (gHitMarker & HITMARKER_OBEYS) - gStatuses3[gBankAttacker] |= STATUS3_MINIMIZED; - gBattlescriptCurrInstr++; -} - -static void atkC8_sethail(void) -{ - if (gBattleWeather & WEATHER_HAIL) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_HAIL; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento -{ - if (gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] == 0 - && gBattleMons[gBankTarget].statStages[STAT_STAGE_SPATK] == 0 - && gBattleCommunication[6] != 1) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gActiveBattler = gBankAttacker; - gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - EmitHealthBarUpdate(0, 0x7FFF); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 5; - } -} - -static void atkCA_setforcedtarget(void) //follow me -{ - gSideTimers[GetBattlerSide(gBankAttacker)].followmeTimer = 1; - gSideTimers[GetBattlerSide(gBankAttacker)].followmeTarget = gBankAttacker; - gBattlescriptCurrInstr++; -} - -static void atkCB_setcharge(void) -{ - gStatuses3[gBankAttacker] |= STATUS3_CHARGED_UP; - gDisableStructs[gBankAttacker].chargeTimer1 = 2; - gDisableStructs[gBankAttacker].chargeTimer2 = 2; - gBattlescriptCurrInstr++; -} - -static void atkCC_callterrainattack(void) //nature power -{ - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = sNaturePowerMoves[gBattleTerrain]; - gBankTarget = GetMoveTarget(gCurrentMove, 0); - BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); - gBattlescriptCurrInstr++; -} - -static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh -{ - if (gBattleMons[gBankAttacker].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS | STATUS_TOXIC_POISON)) - { - gBattleMons[gBankAttacker].status1 = 0; - gBattlescriptCurrInstr += 5; - gActiveBattler = gBankAttacker; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkCE_settorment(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_TORMENT) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gBattleMons[gBankTarget].status2 |= STATUS2_TORMENT; - gBattlescriptCurrInstr += 5; - } -} - -static void atkCF_jumpifnodamage(void) -{ - if (gProtectStructs[gBankAttacker].physicalDmg || gProtectStructs[gBankAttacker].specialDmg) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkD0_settaunt(void) -{ - if (gDisableStructs[gBankTarget].tauntTimer1 == 0) - { - gDisableStructs[gBankTarget].tauntTimer1 = 2; - gDisableStructs[gBankTarget].tauntTimer2 = 2; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkD1_trysethelpinghand(void) -{ - gBankTarget = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gBankTarget]) - && !gProtectStructs[gBankAttacker].helpingHand && !gProtectStructs[gBankTarget].helpingHand) - { - gProtectStructs[gBankTarget].helpingHand = 1; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#ifdef NONMATCHING -static void atkD2_tryswapitems(void) -{ - if ((GetBattlerSide(gBankAttacker) != 1 || gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER) || gTrainerBattleOpponent == SECRET_BASE_OPPONENT)) - { - u8 side = GetBattlerSide(gBankAttacker); - if (gBattleTypeFlags) - } - - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#else -NAKED -static void atkD2_tryswapitems(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r0, _0802A30C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0802A24C\n\ - ldr r0, _0802A310 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0802A314 @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802A24C\n\ - ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - bne _0802A2EE\n\ -_0802A24C:\n\ - ldr r4, _0802A30C @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r0, _0802A310 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0802A314 @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802A290\n\ - ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0802A290\n\ - ldr r0, _0802A31C @ =gWishFutureKnock\n\ - adds r0, 0x29\n\ - adds r0, r2, r0\n\ - ldrb r1, [r0]\n\ - ldr r3, _0802A320 @ =gBitTable\n\ - ldr r2, _0802A324 @ =gBattlerPartyIndexes\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0802A2EE\n\ -_0802A290:\n\ - ldr r0, _0802A328 @ =gBattleMons\n\ - mov r9, r0\n\ - ldr r1, _0802A30C @ =gBankAttacker\n\ - ldrb r4, [r1]\n\ - movs r2, 0x58\n\ - mov r8, r2\n\ - mov r0, r8\n\ - muls r0, r4\n\ - mov r3, r9\n\ - adds r5, r0, r3\n\ - ldrh r3, [r5, 0x2E]\n\ - adds r1, r3, 0\n\ - cmp r1, 0\n\ - bne _0802A2BE\n\ - ldr r0, _0802A32C @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - beq _0802A2EE\n\ -_0802A2BE:\n\ - cmp r1, 0xAF\n\ - beq _0802A2EE\n\ - ldr r7, _0802A32C @ =gBankTarget\n\ - ldrb r0, [r7]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - mov r1, r9\n\ - adds r2, r0, r1\n\ - ldrh r1, [r2, 0x2E]\n\ - cmp r1, 0xAF\n\ - beq _0802A2EE\n\ - adds r0, r3, 0\n\ - subs r0, 0x79\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xB\n\ - bls _0802A2EE\n\ - adds r0, r1, 0\n\ - subs r0, 0x79\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xB\n\ - bhi _0802A334\n\ -_0802A2EE:\n\ - ldr r3, _0802A330 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A30C: .4byte gBankAttacker\n\ -_0802A310: .4byte gBattleTypeFlags\n\ -_0802A314: .4byte 0x00000902\n\ -_0802A318: .4byte gTrainerBattleOpponent\n\ -_0802A31C: .4byte gWishFutureKnock\n\ -_0802A320: .4byte gBitTable\n\ -_0802A324: .4byte gBattlerPartyIndexes\n\ -_0802A328: .4byte gBattleMons\n\ -_0802A32C: .4byte gBankTarget\n\ -_0802A330: .4byte gBattlescriptCurrInstr\n\ -_0802A334:\n\ - adds r0, r2, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3C\n\ - bne _0802A36C\n\ - ldr r1, _0802A360 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0802A364 @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldr r1, _0802A368 @ =gLastUsedAbility\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r7]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A360: .4byte gBattlescriptCurrInstr\n\ -_0802A364: .4byte BattleScript_NoItemSteal\n\ -_0802A368: .4byte gLastUsedAbility\n\ -_0802A36C:\n\ - lsls r0, r4, 1\n\ - ldr r4, _0802A458 @ =gSharedMem + 0x160F0\n\ - adds r6, r0, r4\n\ - ldrh r5, [r5, 0x2E]\n\ - mov r10, r5\n\ - strh r1, [r6]\n\ - ldr r3, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r3]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - add r0, r9\n\ - movs r1, 0\n\ - strh r1, [r0, 0x2E]\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - mov r3, r10\n\ - strh r3, [r0, 0x2E]\n\ - ldr r5, _0802A460 @ =gActiveBattler\n\ - ldr r1, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r1]\n\ - strb r0, [r5]\n\ - str r6, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetMonData\n\ - ldr r2, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r2]\n\ - bl MarkBufferBankForExecution\n\ - ldrb r0, [r7]\n\ - strb r0, [r5]\n\ - ldrb r0, [r7]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - adds r1, 0x2E\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetMonData\n\ - ldrb r0, [r7]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _0802A464 @ =0xfffe9f10\n\ - adds r4, r0\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r2, _0802A468 @ =0x000160e8\n\ - adds r0, r2\n\ - adds r0, r4\n\ - movs r1, 0\n\ - strb r1, [r0]\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r1, _0802A46C @ =0x000160e9\n\ - adds r0, r1\n\ - adds r0, r4\n\ - movs r3, 0\n\ - strb r3, [r0]\n\ - ldr r3, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - adds r0, r4\n\ - movs r2, 0\n\ - strb r2, [r0]\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - adds r0, r4\n\ - strb r2, [r0]\n\ - ldr r1, _0802A470 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - ldr r1, _0802A474 @ =gBattleTextBuff1\n\ - movs r3, 0xFD\n\ - strb r3, [r1]\n\ - movs r2, 0xA\n\ - strb r2, [r1, 0x1]\n\ - ldrh r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - ldrh r0, [r6]\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _0802A478 @ =gBattleTextBuff2\n\ - strb r3, [r1]\n\ - strb r2, [r1, 0x1]\n\ - mov r3, r10\n\ - strb r3, [r1, 0x2]\n\ - mov r2, r10\n\ - lsrs r0, r2, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r1, 0x4]\n\ - cmp r2, 0\n\ - beq _0802A480\n\ - ldrh r0, [r6]\n\ - cmp r0, 0\n\ - beq _0802A494\n\ - ldr r1, _0802A47C @ =gBattleCommunication\n\ - movs r0, 0x2\n\ - b _0802A498\n\ - .align 2, 0\n\ -_0802A458: .4byte gSharedMem + 0x160F0\n\ -_0802A45C: .4byte gBankAttacker\n\ -_0802A460: .4byte gActiveBattler\n\ -_0802A464: .4byte 0xfffe9f10\n\ -_0802A468: .4byte 0x000160e8\n\ -_0802A46C: .4byte 0x000160e9\n\ -_0802A470: .4byte gBattlescriptCurrInstr\n\ -_0802A474: .4byte gBattleTextBuff1\n\ -_0802A478: .4byte gBattleTextBuff2\n\ -_0802A47C: .4byte gBattleCommunication\n\ -_0802A480:\n\ - ldrh r0, [r6]\n\ - cmp r0, 0\n\ - beq _0802A494\n\ - ldr r0, _0802A490 @ =gBattleCommunication\n\ - movs r3, 0\n\ - strb r3, [r0, 0x5]\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A490: .4byte gBattleCommunication\n\ -_0802A494:\n\ - ldr r1, _0802A4AC @ =gBattleCommunication\n\ - movs r0, 0x1\n\ -_0802A498:\n\ - strb r0, [r1, 0x5]\n\ -_0802A49A:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802A4AC: .4byte gBattleCommunication\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkD3_trycopyability(void) //role play -{ - if (gBattleMons[gBankTarget].ability != 0 && gBattleMons[gBankTarget].ability != ABILITY_WONDER_GUARD) - { - gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability; - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkD4_trywish(void) -{ - switch (T2_READ_8(gBattlescriptCurrInstr + 1)) - { - case 0: //use wish - if (gWishFutureKnock.wishCounter[gBankAttacker] == 0) - { - gWishFutureKnock.wishCounter[gBankAttacker] = 2; - gWishFutureKnock.wishUserID[gBankAttacker] = gBattlerPartyIndexes[gBankAttacker]; - gBattlescriptCurrInstr += 6; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - break; - case 1: //heal effect - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gBankTarget; - gBattleTextBuff1[3] = gWishFutureKnock.wishUserID[gBankTarget]; - gBattleTextBuff1[4] = 0xFF; - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - break; - } -} - -static void atkD5_trysetroots(void) //ingrain -{ - if (gStatuses3[gBankAttacker] & STATUS3_ROOTED) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankAttacker] |= STATUS3_ROOTED; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD6_doubledamagedealtifdamaged(void) -{ - if ((gProtectStructs[gBankAttacker].physicalDmg && gProtectStructs[gBankAttacker].physicalBank == gBankTarget) - || (gProtectStructs[gBankAttacker].specialDmg && gProtectStructs[gBankAttacker].specialBank == gBankTarget)) - gBattleStruct->dmgMultiplier = 2; - gBattlescriptCurrInstr++; -} - -static void atkD7_setyawn(void) -{ - if (gStatuses3[gBankTarget] & STATUS3_YAWN || (u8) gBattleMons[gBankTarget].status1) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankTarget] |= 0x1000; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD8_setdamagetohealthdifference(void) -{ - if (gBattleMons[gBankTarget].hp <= gBattleMons[gBankAttacker].hp) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMoveDamage = gBattleMons[gBankTarget].hp - gBattleMons[gBankAttacker].hp; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD9_scaledamagebyhealthratio(void) -{ - if (gDynamicBasePower == 0) - { - u8 power = gBattleMoves[gCurrentMove].power; - gDynamicBasePower = gBattleMons[gBankAttacker].hp * power / gBattleMons[gBankAttacker].maxHP; - if (gDynamicBasePower == 0) - gDynamicBasePower = 1; - } - gBattlescriptCurrInstr++; -} - -static void atkDA_tryswapabilities(void) -{ - if ((gBattleMons[gBankAttacker].ability == 0 && gBattleMons[gBankTarget].ability == 0) - || gBattleMons[gBankAttacker].ability == ABILITY_WONDER_GUARD || gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD - || gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - u8 atk_ability = gBattleMons[gBankAttacker].ability; - gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability; - gBattleMons[gBankTarget].ability = atk_ability; - gBattlescriptCurrInstr += 5; - } -} - -static void atkDB_tryimprision(void) -{ - u8 r8 = 0; - if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISIONED)) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - else - { - u8 bank; - PressurePPLoseOnUsingImprision(gBankAttacker); - for (bank = 0; bank < gBattlersCount; bank++) - { - if (r8 != GetBattlerSide(bank)) - { - int j; - for (j = 0; j < 4; j++) - { - int k; - for (k = 0; k < 4; k++) - { - if (gBattleMons[gBankAttacker].moves[j] == gBattleMons[bank].moves[k] && gBattleMons[gBankAttacker].moves[j]) - break; - } - if (k != 4) - break; - } - if (j != 4) - { - gStatuses3[gBankAttacker] |= STATUS3_IMPRISIONED; - gBattlescriptCurrInstr += 5; - break; - } - } - } - if (bank == gBattlersCount) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } -} - -static void atkDC_trysetgrudge(void) -{ - if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankAttacker] |= STATUS3_GRUDGE; - gBattlescriptCurrInstr += 5; - } -} - -static void atkDD_weightdamagecalculation(void) -{ - int i; - for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2) - { - if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - break; - } - if (sWeightToDamageTable[i] != 0xFFFF) - gDynamicBasePower = sWeightToDamageTable[i + 1]; - else - gDynamicBasePower = 120; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atkDE_asistattackselect(void) -{ - u32 chooseable_moves_no = 0; - struct Pokemon* party; - int i, j; - u16* chooseable_moves; - if (GetBattlerPosition(gBankAttacker) & 1) - party = gEnemyParty; - else - party = gPlayerParty; - - for (i = 0; i < 6; i++) - { - if (i == gBattlerPartyIndexes[gBankAttacker]) - break; - if (!GetMonData(&party[i], MON_DATA_SPECIES2) || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - break; - chooseable_moves = &gBattleStruct->assistMove[chooseable_moves_no]; - for (j = 0; j < 4; j++) - { - int k; - u16 move = GetMonData(&party[i], MON_DATA_MOVE1 + i); - if (IsMoveUnchoosable(move)) - break; - //sMovesForbiddenToCopy[k] - for (k = 0; ;k++) - { - if (sMovesForbiddenToCopy[k] == 0xFFFF) - { - if (move) - { - *chooseable_moves = move; - chooseable_moves++; - chooseable_moves_no++; - } - break; - } - if (sMovesForbiddenToCopy[k] == move) - break; - } - } - } - if (chooseable_moves_no) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gRandomMove = gBattleStruct->assistMove[Random() % chooseable_moves_no]; - gBankTarget = GetMoveTarget(gRandomMove, 0); - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -#else -NAKED -static void atkDE_asistattackselect(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r0, _0802AB9C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerPosition\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - ldr r0, _0802ABA0 @ =gPlayerParty\n\ - str r0, [sp]\n\ - cmp r1, 0\n\ - beq _0802AAAC\n\ - ldr r1, _0802ABA4 @ =gEnemyParty\n\ - str r1, [sp]\n\ -_0802AAAC:\n\ - movs r2, 0\n\ -_0802AAAE:\n\ - ldr r1, _0802ABA8 @ =gBattlerPartyIndexes\n\ - ldr r0, _0802AB9C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - adds r1, r2, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldrh r0, [r0]\n\ - cmp r2, r0\n\ - beq _0802AB54\n\ - movs r0, 0x64\n\ - adds r6, r2, 0\n\ - muls r6, r0\n\ - ldr r0, [sp]\n\ - adds r4, r0, r6\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802AB54\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _0802AB54\n\ - movs r5, 0\n\ - ldr r1, _0802ABAC @ =0x0000ffff\n\ - mov r8, r1\n\ - mov r9, r6\n\ - mov r1, r10\n\ - lsls r0, r1, 1\n\ - ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\ - adds r6, r0, r1\n\ -_0802AAF8:\n\ - movs r7, 0\n\ - adds r1, r5, 0\n\ - adds r1, 0xD\n\ - ldr r0, [sp]\n\ - add r0, r9\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - adds r0, r4, 0\n\ - bl IsMoveUnchoosable\n\ - lsls r0, 24\n\ - adds r1, r5, 0x1\n\ - cmp r0, 0\n\ - bne _0802AB4E\n\ - ldr r0, _0802ABB4 @ =sMovesForbiddenToCopy\n\ - ldrh r2, [r0]\n\ - adds r3, r0, 0\n\ - cmp r2, r8\n\ - beq _0802AB42\n\ - cmp r4, r2\n\ - beq _0802AB38\n\ - ldr r5, _0802ABAC @ =0x0000ffff\n\ - adds r2, r3, 0\n\ -_0802AB2A:\n\ - adds r2, 0x2\n\ - adds r7, 0x1\n\ - ldrh r0, [r2]\n\ - cmp r0, r5\n\ - beq _0802AB42\n\ - cmp r4, r0\n\ - bne _0802AB2A\n\ -_0802AB38:\n\ - lsls r0, r7, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - cmp r0, r8\n\ - bne _0802AB4E\n\ -_0802AB42:\n\ - cmp r4, 0\n\ - beq _0802AB4E\n\ - strh r4, [r6]\n\ - adds r6, 0x2\n\ - movs r0, 0x1\n\ - add r10, r0\n\ -_0802AB4E:\n\ - adds r5, r1, 0\n\ - cmp r5, 0x3\n\ - ble _0802AAF8\n\ -_0802AB54:\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, 0x5\n\ - ble _0802AAAE\n\ - mov r1, r10\n\ - cmp r1, 0\n\ - beq _0802ABCC\n\ - ldr r2, _0802ABB8 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _0802ABBC @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0802ABC0 @ =gRandomMove\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - mov r0, r10\n\ - muls r0, r1\n\ - asrs r0, 8\n\ - lsls r0, 1\n\ - ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r4]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl GetMoveTarget\n\ - ldr r1, _0802ABC4 @ =gBankTarget\n\ - strb r0, [r1]\n\ - ldr r1, _0802ABC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _0802ABE6\n\ - .align 2, 0\n\ -_0802AB9C: .4byte gBankAttacker\n\ -_0802ABA0: .4byte gPlayerParty\n\ -_0802ABA4: .4byte gEnemyParty\n\ -_0802ABA8: .4byte gBattlerPartyIndexes\n\ -_0802ABAC: .4byte 0x0000ffff\n\ -_0802ABB0: .4byte gSharedMem + 0x16024\n\ -_0802ABB4: .4byte sMovesForbiddenToCopy\n\ -_0802ABB8: .4byte gHitMarker\n\ -_0802ABBC: .4byte 0xfffffbff\n\ -_0802ABC0: .4byte gRandomMove\n\ -_0802ABC4: .4byte gBankTarget\n\ -_0802ABC8: .4byte gBattlescriptCurrInstr\n\ -_0802ABCC:\n\ - ldr r3, _0802ABF8 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_0802ABE6:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802ABF8: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -#endif // NONMATCHING - -static void atkDF_trysetmagiccoat(void) -{ - gBankTarget = gBankAttacker; - gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentTurnActionNumber == gBattlersCount - 1) //last turn - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gProtectStructs[gBankAttacker].bounceMove = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkE0_trysetsnatch(void) -{ - gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentTurnActionNumber == gBattlersCount - 1) //last turn - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - gProtectStructs[gBankAttacker].stealMove = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkE1_trygetintimidatetarget(void) -{ - u8 side; - - gBattleStruct->scriptingActive = ewram160DD; - side = GetBattlerSide(gBattleStruct->scriptingActive); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 9; - gBattleTextBuff1[2] = gBattleMons[gBattleStruct->scriptingActive].ability; - gBattleTextBuff1[3] = 0xFF; - - for (;gBankTarget < gBattlersCount; gBankTarget++) - { - if (GetBattlerSide(gBankTarget) == side) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBankTarget])) - break; - } - - if (gBankTarget >= gBattlersCount) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atkE2_switchoutabilities(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - switch (gBattleMons[gActiveBattler].ability) - { - case ABILITY_NATURAL_CURE: - gBattleMons[gActiveBattler].status1 = 0; - EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[ewram16064arr(gActiveBattler)], 4, &gBattleMons[gActiveBattler].status1); - MarkBufferBankForExecution(gActiveBattler); - break; - } - gBattlescriptCurrInstr += 2; -} - -static void atkE3_jumpifhasnohp(void) -{ - gActiveBattler = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); - if (gBattleMons[gActiveBattler].hp == 0) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atkE4_getsecretpowereffect(void) -{ - switch (gBattleTerrain) - { - case BATTLE_TERRAIN_GRASS: - gBattleCommunication[MOVE_EFFECT_BYTE] = 2; - break; - case BATTLE_TERRAIN_LONG_GRASS: - gBattleCommunication[MOVE_EFFECT_BYTE] = 1; - break; - case BATTLE_TERRAIN_SAND: - gBattleCommunication[MOVE_EFFECT_BYTE] = 27; - break; - case BATTLE_TERRAIN_UNDERWATER: - gBattleCommunication[MOVE_EFFECT_BYTE] = 23; - break; - case BATTLE_TERRAIN_WATER: - gBattleCommunication[MOVE_EFFECT_BYTE] = 22; - break; - case BATTLE_TERRAIN_POND: - gBattleCommunication[MOVE_EFFECT_BYTE] = 24; - break; - case BATTLE_TERRAIN_MOUNTAIN: - gBattleCommunication[MOVE_EFFECT_BYTE] = 7; - break; - case BATTLE_TERRAIN_CAVE: - gBattleCommunication[MOVE_EFFECT_BYTE] = 8; - break; - default: - gBattleCommunication[MOVE_EFFECT_BYTE] = 5; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkE5_pickup(void) -{ - int i; - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - u16 held_item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - u8 ability; - if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY)) - ability = gBaseStats[species].ability2; - else - ability = gBaseStats[species].ability1; - - if (ability == ABILITY_PICKUP && species != 0 && species != SPECIES_EGG && held_item == 0 && (Random() % 10) == 0) - { - s32 chance = Random() % 100; - s32 j; - for (j = 0; j < 18; j += 2) - { - if (sPickupItems[j + 1] > chance) - break; - } - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, (const void*) &sPickupItems[j]); - } - } - gBattlescriptCurrInstr++; -} - -static void atkE6_docastformchangeanimation(void) -{ - gActiveBattler = gBattleStruct->scriptingActive; - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) - gBattleStruct->castformToChangeInto |= 0x80; - EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, gBattleStruct->castformToChangeInto); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr++; -} - -static void atkE7_trycastformdatachange(void) -{ - u8 form; - gBattlescriptCurrInstr++; - form = CastformDataTypeChange(gBattleStruct->scriptingActive); - if (form) - { - BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleStruct->castformToChangeInto = form - 1; - } -} - -static void atkE8_settypebasedhalvers(void) //water/mud sport -{ - bool8 worked = FALSE; - if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT) - { - if (!(gStatuses3[gBankAttacker] & STATUS3_MUDSPORT)) - { - gStatuses3[gBankAttacker] |= STATUS3_MUDSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - worked = TRUE; - } - } - else //water sport - { - if (!(gStatuses3[gBankAttacker] & STATUS3_WATERSPORT)) - { - gStatuses3[gBankAttacker] |= STATUS3_WATERSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - worked = TRUE; - } - } - if (worked) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkE9_setweatherballtype(void) -{ - if (WEATHER_HAS_EFFECT) - { - if ((u8)(gBattleWeather)) - gBattleStruct->dmgMultiplier = 2; - if (gBattleWeather & WEATHER_RAIN_ANY) - gBattleStruct->dynamicMoveType = TYPE_WATER | 0x80; - else if (gBattleWeather & WEATHER_SANDSTORM_ANY) - gBattleStruct->dynamicMoveType = TYPE_ROCK | 0x80; - else if (gBattleWeather & WEATHER_SUN_ANY) - gBattleStruct->dynamicMoveType = TYPE_FIRE | 0x80; - else if (gBattleWeather & WEATHER_HAIL) - gBattleStruct->dynamicMoveType = TYPE_ICE | 0x80; - else - gBattleStruct->dynamicMoveType = TYPE_NORMAL | 0x80; - } - gBattlescriptCurrInstr++; -} - -static void atkEA_tryrecycleitem(void) -{ - u16* used_item; - gActiveBattler = gBankAttacker; - used_item = USED_HELD_ITEM(gActiveBattler); - if (*used_item && gBattleMons[gActiveBattler].item == 0) - { - gLastUsedItem = *used_item; - *used_item = 0; - gBattleMons[gActiveBattler].item = gLastUsedItem; - EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkEB_settypetoterrain(void) -{ - if (gBattleMons[gBankAttacker].type1 != sTerrainToType[gBattleTerrain] && gBattleMons[gBankAttacker].type2 != sTerrainToType[gBattleTerrain]) - { - gBattleMons[gBankAttacker].type1 = sTerrainToType[gBattleTerrain]; - gBattleMons[gBankAttacker].type2 = sTerrainToType[gBattleTerrain]; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = sTerrainToType[gBattleTerrain]; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkEC_pursuitrelated(void) -{ - gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]) && gActionForBanks[gActiveBattler] == 0 && gChosenMovesByBanks[gActiveBattler] == MOVE_PURSUIT) - { - gActionsByTurnOrder[gActiveBattler] = 11; - gCurrentMove = MOVE_PURSUIT; - gBattlescriptCurrInstr += 5; - gBattleStruct->animTurn = 1; - gBattleStruct->unk160A7 = gBankAttacker; - gBankAttacker = gActiveBattler; - } - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); -} - -static void atkED_snatchsetbanks(void) -{ - gEffectBank = gBankAttacker; - if (gBankAttacker == gBankTarget) - gBankAttacker = gBankTarget = gBattleStruct->scriptingActive; - else - gBankTarget = gBattleStruct->scriptingActive; - gBattleStruct->scriptingActive = gEffectBank; - gBattlescriptCurrInstr++; -} - -static void atkEE_removelightscreenreflect(void) //brick break -{ - u8 side = GetBattlerSide(gBankAttacker) ^ 1; - if (gSideTimers[side].reflectTimer || gSideTimers[side].lightscreenTimer) - { - gSideAffecting[side] &= ~(SIDE_STATUS_REFLECT); - gSideAffecting[side] &= ~(SIDE_STATUS_LIGHTSCREEN); - gSideTimers[side].reflectTimer = 0; - gSideTimers[side].lightscreenTimer = 0; - gBattleStruct->animTurn = 1; - gBattleStruct->animTargetsHit = 1; - } - else - { - gBattleStruct->animTurn = 0; - gBattleStruct->animTargetsHit = 0; - } - gBattlescriptCurrInstr++; -} - -void atkEF_handleballthrow(void) -{ - u8 ball_multiplier = 0; - if (gBattleExecBuffer) - return; - - gActiveBattler = gBankAttacker; - gBankTarget = gBankAttacker ^ 1; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - EmitBallThrow(0, 5); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; - } - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - { - EmitBallThrow(0, 4); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_WallyBallThrow; - } - else - { - u32 odds; - u8 catch_rate; - if (gLastUsedItem == ITEM_SAFARI_BALL) - catch_rate = gBattleStruct->unk16089 * 1275 / 100; //correct the name to safariFleeRate - else - catch_rate = gBaseStats[gBattleMons[gBankTarget].species].catchRate; - if (gLastUsedItem > 5) - { - switch (gLastUsedItem) - { - case ITEM_NET_BALL: - if (gBattleMons[gBankTarget].type1 == TYPE_WATER || gBattleMons[gBankTarget].type2 == TYPE_WATER || gBattleMons[gBankTarget].type1 == TYPE_BUG || gBattleMons[gBankTarget].type2 == TYPE_BUG) - ball_multiplier = 30; - else - ball_multiplier = 10; - break; - case ITEM_DIVE_BALL: - if (Overworld_GetMapTypeOfSaveblockLocation() == 5) - ball_multiplier = 35; - else - ball_multiplier = 10; - break; - case ITEM_NEST_BALL: - if (gBattleMons[gBankTarget].level <= 39) - { - ball_multiplier = 40 - gBattleMons[gBankTarget].level; - if (ball_multiplier <= 9) - ball_multiplier = 10; - } - else - ball_multiplier = 10; - break; - case ITEM_REPEAT_BALL: - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - ball_multiplier = 30; - else - ball_multiplier = 10; - break; - case ITEM_TIMER_BALL: - ball_multiplier = gBattleResults.battleTurnCounter + 10; - if (ball_multiplier > 40) - ball_multiplier = 40; - break; - case ITEM_LUXURY_BALL: - case ITEM_PREMIER_BALL: - ball_multiplier = 10; - break; - } - } - else - ball_multiplier = sBallCatchBonuses[gLastUsedItem - 2]; - - odds = (catch_rate * ball_multiplier / 10) * (gBattleMons[gBankTarget].maxHP * 3 - gBattleMons[gBankTarget].hp * 2) / (3 * gBattleMons[gBankTarget].maxHP); - if (gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) - odds *= 2; - if (gBattleMons[gBankTarget].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS /*| STATUS_TOXIC_POISON */)) //nice one gf - odds = (odds * 15) / 10; - - if (gLastUsedItem != ITEM_SAFARI_BALL) - { - if (gLastUsedItem == ITEM_MASTER_BALL) - { - gBattleResults.unk5_1 = 1; - } - else - { - if (gBattleResults.usedBalls[gLastUsedItem - ITEM_ULTRA_BALL] < 0xFF) - gBattleResults.usedBalls[gLastUsedItem - ITEM_ULTRA_BALL]++; - } - } - if (odds > 254) //poke caught - { - EmitBallThrow(0, 4); - MarkBufferBankForExecution(gActiveBattler); - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem); - if (CalculatePlayerPartyCount() == 6) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else //poke may be caught, calculate shakes - { - u8 shakes; - odds = Sqrt(Sqrt(16711680 / odds)); - odds = 1048560 / odds; - for (shakes = 0; shakes < 4 && Random() < odds; shakes++) {} - if (gLastUsedItem == ITEM_MASTER_BALL) - shakes = 4; //why calculate the shakes before that check? - EmitBallThrow(0, shakes); - MarkBufferBankForExecution(gActiveBattler); - if (shakes == 4) //poke caught, copy of the code above - { - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem); - if (CalculatePlayerPartyCount() == 6) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else //rip - { - gBattleCommunication[MULTISTRING_CHOOSER] = shakes; - gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; - } - } - } -} - -static void atkF0_givecaughtmon(void) -{ - GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]]); - gBattleResults.caughtPoke = gBattleMons[gBankAttacker ^ 1].species; - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleResults.caughtNick); - gBattlescriptCurrInstr++; -} - -static void atkF1_trysetcaughtmondexflags(void) -{ - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - else - { - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3); - if (gBattleMons[gBankTarget].species == SPECIES_UNOWN) - gSaveBlock2.pokedex.unownPersonality = gBattleMons[gBankTarget].personality; - if (gBattleMons[gBankTarget].species == SPECIES_SPINDA) //else if - gSaveBlock2.pokedex.spindaPersonality = gBattleMons[gBankTarget].personality; - gBattlescriptCurrInstr += 5; - } -} - -extern const u32 gBattleTerrainTiles_Building[]; -extern const u32 gBattleTerrainTilemap_Building[]; -extern const u32 gBattleTerrainPalette_BattleTower[]; - -static void atkF2_displaydexinfo(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); - gBattleCommunication[0]++; - break; - case 1: - if (!gPaletteFade.active) - { - gBattleCommunication[1] = sub_809070C(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), gBattleMons[gBankTarget].otId, gBattleMons[gBankTarget].personality); - gBattleCommunication[0]++; - } - break; - case 2: - if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2 && !gTasks[gBattleCommunication[1]].isActive) - { - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - REG_BG3CNT = 0x5a0b; - gBattle_BG3_X = 0x100; - BeginNormalPaletteFade(0xFFFC, 0, 16, 0, RGB(0, 0, 0)); - gBattleCommunication[0]++; - } - break; - case 3: - if (!gPaletteFade.active) - gBattlescriptCurrInstr++; - break; - } -} - -NAKED -void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r4, [sp, 0x20]\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r12, r1\n\ - lsls r2, 24\n\ - lsrs r5, r2, 24\n\ - lsls r3, 24\n\ - lsrs r7, r3, 24\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r8, r4\n\ - mov r2, r12\n\ - cmp r2, r7\n\ - bgt _0802BC5A\n\ - lsls r1, r6, 1\n\ - ldr r0, _0802BC20 @ =0x0600c000\n\ - adds r1, r0\n\ - mov r9, r1\n\ -_0802BC06:\n\ - adds r1, r6, 0\n\ - adds r0, r2, 0x1\n\ - mov r10, r0\n\ - cmp r1, r5\n\ - bgt _0802BC54\n\ - lsls r0, r2, 6\n\ - mov r4, r9\n\ - adds r3, r4, r0\n\ -_0802BC16:\n\ - cmp r2, r12\n\ - bne _0802BC28\n\ - ldr r0, _0802BC24 @ =0x00001022\n\ - b _0802BC36\n\ - .align 2, 0\n\ -_0802BC20: .4byte 0x0600c000\n\ -_0802BC24: .4byte 0x00001022\n\ -_0802BC28:\n\ - cmp r2, r7\n\ - bne _0802BC34\n\ - ldr r0, _0802BC30 @ =0x00001028\n\ - b _0802BC36\n\ - .align 2, 0\n\ -_0802BC30: .4byte 0x00001028\n\ -_0802BC34:\n\ - ldr r0, _0802BC68 @ =0x00001025\n\ -_0802BC36:\n\ - cmp r1, r6\n\ - beq _0802BC42\n\ - adds r0, 0x1\n\ - cmp r1, r5\n\ - bne _0802BC42\n\ - adds r0, 0x1\n\ -_0802BC42:\n\ - mov r4, r8\n\ - cmp r4, 0\n\ - beq _0802BC4A\n\ - movs r0, 0\n\ -_0802BC4A:\n\ - strh r0, [r3]\n\ - adds r3, 0x2\n\ - adds r1, 0x1\n\ - cmp r1, r5\n\ - ble _0802BC16\n\ -_0802BC54:\n\ - mov r2, r10\n\ - cmp r2, r7\n\ - ble _0802BC06\n\ -_0802BC5A:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802BC68: .4byte 0x00001025\n\ - .syntax divided"); -} - -void sub_802BC6C(void) -{ - MenuCursor_SetPos814A880(0xC8, ((gBattleCommunication[1] << 28) + 1207959552) >> 24); //what could that be? -} - -void nullsub_6(void) -{ - return; -} - -static void atkF3_trygivecaughtmonnick(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - sub_8023A80(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] == 0) - { - gBattleCommunication[0]++; - BeginFastPaletteFade(3); - } - else - gBattleCommunication[0] = 4; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gBattleCommunication[0] = 4; - } - break; - case 2: - if (!gPaletteFade.active) - { - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleStruct->caughtNick); - 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); - gBattleCommunication[0]++; - } - break; - case 3: - if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active ) - { - SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleStruct->caughtNick); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } - break; - case 4: - if (CalculatePlayerPartyCount() == 6) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - break; - } -} - -static void atkF4_subattackerhpbydmg(void) -{ - gBattleMons[gBankAttacker].hp -= gBattleMoveDamage; - gBattlescriptCurrInstr++; -} - -static void atkF5_removeattackerstatus1(void) -{ - gBattleMons[gBankAttacker].status1 = 0; - gBattlescriptCurrInstr++; -} - -static void atkF6_finishaction(void) -{ - gCurrentActionFuncId = 0xC; -} - -static void atkF7_finishturn(void) -{ - gCurrentActionFuncId = 0xC; - gCurrentTurnActionNumber = gBattlersCount; -} |