diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 940f30160..4d0b9a614 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2237,3 +2237,8 @@ .endif waitmessage B_WAIT_TIME_LONG .endm + + .macro jumpifemergencyexited battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_EMERGENCY_EXITED + .4byte \ptr + .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 42ee1b0e9..9ff5838b1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3055,6 +3055,7 @@ BattleScript_EffectHitEscape: jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0, BattleScript_HitEscapeEnd jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_HitEscapeEnd jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_HitEscapeEnd + jumpifemergencyexited BS_TARGET, BattleScript_HitEscapeEnd openpartyscreen BS_ATTACKER, BattleScript_HitEscapeEnd switchoutabilities BS_ATTACKER waitstate diff --git a/include/battle.h b/include/battle.h index 94119f9b4..0b23033ec 100644 --- a/include/battle.h +++ b/include/battle.h @@ -195,6 +195,7 @@ struct SpecialStatus // End of byte u8 weatherAbilityDone:1; u8 terrainAbilityDone:1; + u8 emergencyExited:1; }; struct SideTimer diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index fdf703c1a..123fb5d49 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -255,6 +255,7 @@ #define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 164 #define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 165 #define VARIOUS_JUMP_IF_NO_VALID_TARGETS 166 +#define VARIOUS_JUMP_IF_EMERGENCY_EXITED 167 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ab516d01a..f4d0d640d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5922,6 +5922,7 @@ static void Cmd_moveend(void) if (gBattleResources->flags->flags[i] & RESOURCE_FLAG_EMERGENCY_EXIT) { gBattleResources->flags->flags[i] &= ~RESOURCE_FLAG_EMERGENCY_EXIT; + gSpecialStatuses[i].emergencyExited = TRUE; gBattlerTarget = gBattlerAbility = i; BattleScriptPushCursor(); if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || GetBattlerSide(i) == B_SIDE_PLAYER) @@ -10269,6 +10270,12 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_JUMP_IF_EMERGENCY_EXITED: + if (gSpecialStatuses[gActiveBattler].emergencyExited) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; } // End of switch (gBattlescriptCurrInstr[2]) gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index a4c6dbedc..eff2faf87 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -515,9 +515,11 @@ void HandleAction_UseMove(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) BattleArena_AddMindPoints(gBattlerAttacker); - // Record HP of each battler for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { gBattleStruct->hpBefore[i] = gBattleMons[i].hp; + gSpecialStatuses[i].emergencyExited = FALSE; + } gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; }