Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion asm/include/battle_commands.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1633,7 +1633,13 @@
.long (((\arg_2 - .) / 4) - 1)
.endm

.equ BASE_ENGINE_BTL_SCR_CMDS_MAX, 298
.macro TryActivateEmergencyExit arg_0, arg_1
.long 299
.long \arg_0
.long (((\arg_1 - .) / 4) - 1)
.endm

.equ BASE_ENGINE_BTL_SCR_CMDS_MAX, 299

// .macro YourCustomCommand
// .long (BASE_ENGINE_BTL_SCR_CMDS_MAX + 1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ _047:
WaitTime 72
HealthbarSlideIn BATTLER_CATEGORY_SWITCHED_MON
Wait
SetCurrentMoveSwitchingStatus CURRENT_MOVE_NO_SWITCH
Call BATTLE_SUBSCRIPT_HEALING_WISH
Call BATTLE_SUBSCRIPT_HAZARDS_CHECK
CompareVarToValue OPCODE_GT, BSCRIPT_VAR_BATTLER_FAINTED, BATTLER_ENEMY2, _081
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ _001:
WaitTime 72
HealthbarSlideIn BATTLER_CATEGORY_SWITCHED_MON
Wait
SetCurrentMoveSwitchingStatus CURRENT_MOVE_NO_SWITCH
Call BATTLE_SUBSCRIPT_HEALING_WISH
Call BATTLE_SUBSCRIPT_HAZARDS_CHECK
CompareVarToValue OPCODE_FLAG_NOT, BSCRIPT_VAR_BATTLE_STATUS, BATTLE_STATUS_FAINTED, _030
Call BATTLE_SUBSCRIPT_FAINT_MON

_030:
GoToIfAnySwitches _001
Call BATTLE_SUBSCRIPT_SWITCH_IN_ABILITY_CHECK
End
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ _038:
PlayBattleAnimation BATTLER_CATEGORY_MSG_TEMP, BATTLE_ANIMATION_POISONED
Wait
UpdateVar OPCODE_FLAG_ON, BSCRIPT_VAR_BATTLE_STATUS, BATTLE_STATUS_NO_BLINK
GoToSubscript BATTLE_SUBSCRIPT_UPDATE_HP
Call BATTLE_SUBSCRIPT_UPDATE_HP
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noActivation
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT

_noActivation:
Call BATTLE_SUBSCRIPT_SWITCH_IN_ABILITY_CHECK

_055:
Expand Down
6 changes: 5 additions & 1 deletion data/battle_scripts/subscripts/subscript_0026_BURN_DAMAGE.s
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ _020:
PlayBattleAnimation BATTLER_CATEGORY_MSG_TEMP, BATTLE_ANIMATION_BURNED
Wait
UpdateVar OPCODE_FLAG_ON, BSCRIPT_VAR_BATTLE_STATUS, BATTLE_STATUS_NO_BLINK
GoToSubscript BATTLE_SUBSCRIPT_UPDATE_HP
Call BATTLE_SUBSCRIPT_UPDATE_HP
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noActivation
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT

_noActivation:
Call BATTLE_SUBSCRIPT_SWITCH_IN_ABILITY_CHECK

_041:
Expand Down
6 changes: 5 additions & 1 deletion data/battle_scripts/subscripts/subscript_0059_BIND_EFFECT.s
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,11 @@ _DealDamage:
Wait
WaitButtonABTime 30
UpdateVar OPCODE_FLAG_ON, BSCRIPT_VAR_BATTLE_STATUS, BATTLE_STATUS_NO_BLINK
GoToSubscript BATTLE_SUBSCRIPT_UPDATE_HP
Call BATTLE_SUBSCRIPT_UPDATE_HP
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noActivation
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT

_noActivation:
Call BATTLE_SUBSCRIPT_SWITCH_IN_ABILITY_CHECK

_End:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ _050:
PrintMessage 296, TAG_NICKNAME, BATTLER_CATEGORY_MSG_DEFENDER
Wait
WaitButtonABTime 30
UpdateVarFromVar OPCODE_SET, BSCRIPT_VAR_MSG_BATTLER_TEMP, BSCRIPT_VAR_MSG_DEFENDER
UpdateMonDataFromVar OPCODE_GET, BATTLER_CATEGORY_MSG_DEFENDER, BMON_DATA_MAXHP, BSCRIPT_VAR_HP_CALC
DivideVarByValue BSCRIPT_VAR_HP_CALC, 8
UpdateVar OPCODE_MUL, BSCRIPT_VAR_HP_CALC, -1
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noActivation //needs ctx->hp_calc_work
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT

_noActivation:
Call BATTLE_SUBSCRIPT_SWITCH_IN_ABILITY_CHECK
End

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ _000:
Wait
WaitButtonABTime 30
UpdateVar OPCODE_FLAG_ON, BSCRIPT_VAR_BATTLE_STATUS, BATTLE_STATUS_NO_BLINK
GoToSubscript BATTLE_SUBSCRIPT_UPDATE_HP
Call BATTLE_SUBSCRIPT_UPDATE_HP
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noActivation
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT

_noActivation:
Call BATTLE_SUBSCRIPT_SWITCH_IN_ABILITY_CHECK

_033:
Expand Down
6 changes: 5 additions & 1 deletion data/battle_scripts/subscripts/subscript_0098_CURSE_DAMAGE.s
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ _000:
Wait
WaitButtonABTime 30
UpdateVar OPCODE_FLAG_ON, BSCRIPT_VAR_BATTLE_STATUS, BATTLE_STATUS_NO_BLINK
GoToSubscript BATTLE_SUBSCRIPT_UPDATE_HP
Call BATTLE_SUBSCRIPT_UPDATE_HP
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noActivation
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT

_noActivation:
Call BATTLE_SUBSCRIPT_SWITCH_IN_ABILITY_CHECK

_033:
Expand Down
10 changes: 10 additions & 0 deletions data/battle_scripts/subscripts/subscript_0099_HAZARDS_CHECK.s
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ _checkSpikes:
PrintMessage 429, TAG_NICKNAME, BATTLER_CATEGORY_SWITCHED_MON
Wait
WaitButtonABTime 30
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noWimpOutFromSpikes
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT
GoToSubscript BATTLE_SUBSCRIPT_SHOW_PARTY_LIST

_noWimpOutFromSpikes:
GoTo _landingPad

_checkIfShouldDoTSpikes:
Expand Down Expand Up @@ -124,4 +129,9 @@ _checkStealthRock:
PrintMessage 1079, TAG_NICKNAME, BATTLER_CATEGORY_SWITCHED_MON
Wait
WaitButtonABTime 30
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noWimpOutFromRocks
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT
GoToSubscript BATTLE_SUBSCRIPT_SHOW_PARTY_LIST

_noWimpOutFromRocks:
GoTo _landingPad
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,17 @@ _083:
CompareVarToValue OPCODE_FLAG_SET, BSCRIPT_VAR_FIELD_CONDITION, FIELD_CONDITION_SUN_ALL, _095
// {1} is buffeted by the {0}!
PrintMessage 285, TAG_MOVE_NICKNAME, BATTLER_CATEGORY_MSG_TEMP, BATTLER_CATEGORY_MSG_TEMP
GoTo _112
Wait
WaitButtonABTime 30
Call BATTLE_SUBSCRIPT_UPDATE_HP
CompareVarToValue OPCODE_FLAG_NOT, BSCRIPT_VAR_BATTLE_STATUS, BATTLE_STATUS_FAINTED, _noFaint
Call BATTLE_SUBSCRIPT_FAINT_MON
GoTo _140

_noFaint:
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _140
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT
GoTo _140

_095:
CompareVarToValue OPCODE_EQU, BSCRIPT_VAR_TEMP_DATA, 2, _107
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,9 @@ _000:
PrintMessage 1132, TAG_NICKNAME_ITEM, BATTLER_CATEGORY_MSG_TEMP, BATTLER_CATEGORY_MSG_BATTLER_TEMP
Wait
WaitButtonABTime 30
TryActivateEmergencyExit BATTLER_CATEGORY_MSG_BATTLER_TEMP, _noActivation
Call BATTLE_SUBSCRIPT_HANDLE_WIMP_OUT_EMERGENCY_EXIT

_noActivation:
Call BATTLE_SUBSCRIPT_SWITCH_IN_ABILITY_CHECK
End
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ _155:
Wait
HealthbarSlideOut BATTLER_CATEGORY_MSG_BATTLER_TEMP
Wait
UpdateVar OPCODE_FLAG_ON, BSCRIPT_VAR_BATTLE_STATUS_2, BATTLE_STATUS2_UTURN
UpdateVar OPCODE_FLAG_OFF, BSCRIPT_VAR_BATTLE_STATUS, BATTLE_STATUS_SYNCRONIZE
UpdateVar OPCODE_SET, BSCRIPT_VAR_SIDE_EFFECT_MON_SELF_TURN_STATUS_FLAGS, SELF_TURN_FLAG_CLEAR
SetCurrentMoveSwitchingStatus CURRENT_MOVE_SWITCH_PENDING
Expand Down
106 changes: 106 additions & 0 deletions data/battle_tests/abilities/emergency_exit/item_heal_stays_below_50.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Test: Emergency Exit - switches out when going below 50% max-HP but healing via held item is not enough to go back above the threshold
#include "../../battle_tests.h"
BEGIN_TEST
{
.battleType = BATTLE_TYPE_TRAINER,
.weather = FIELD_CONDITION_NONE,
.fieldCondition = 0,
.terrain = TERRAIN_NONE,
.playerParty = {
{
.species = SPECIES_STARAPTOR,
.level = 40,
.form = 0,
.ability = ABILITY_RECKLESS,
.item = ITEM_NONE,
.moves = { MOVE_BRAVE_BIRD, MOVE_NONE, MOVE_NONE, MOVE_NONE },
.hp = FULL_HP,
.status = 0,
.condition2 = 0,
.moveEffectFlags = 0,
},
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE }
},
.enemyParty = { {
.species = SPECIES_GOLISOPOD,
.level = 50,
.form = 0,
.ability = ABILITY_EMERGENCY_EXIT,
.item = ITEM_ORAN_BERRY,
.moves = { MOVE_SLEEP_TALK, MOVE_NONE, MOVE_NONE, MOVE_NONE },
.hp = FULL_HP,
.status = 0,
.condition2 = 0,
.moveEffectFlags = 0,
},
{
.species = SPECIES_LITTEN,
.level = 50,
.form = 0,
.ability = ABILITY_INTIMIDATE,
.item = ITEM_NONE,
.moves = { MOVE_SLEEP_TALK, MOVE_NONE, MOVE_NONE, MOVE_NONE },
.hp = FULL_HP,
.status = 0,
.condition2 = 0,
.moveEffectFlags = 0,
},
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE } },
.playerScript = { {
{ ACTION_MOVE_SLOT_1, BATTLER_ENEMY_FIRST },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
},
{
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
} },
.enemyScript = { {
{ ACTION_MOVE_SLOT_1, BATTLER_PLAYER_FIRST },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
},
{
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
} },
.expectations = {
{ .expectationType = EXPECTATION_TYPE_HP_BAR, .battlerIDOrPartySlot = BATTLER_ENEMY_FIRST, .expectationValue.hpTaken = { 96, 96, 98, 98, 98, 102, 102, 102, 104, 104, 108, 108, 108, 110, 110, 114 } },
{ .expectationType = EXPECTATION_TYPE_MESSAGE, .expectationValue.message = "Staraptor was damaged by the recoil!" },
{ .expectationType = EXPECTATION_TYPE_MESSAGE, .expectationValue.message = "The opposing Golisopod restored its health using its Oran Berry!" },
{ .expectationType = EXPECTATION_TYPE_MESSAGE, .expectationValue.message = "Golisopod's EmergencyExit" },
{ .expectationType = EXPECTATION_TYPE_MESSAGE_CONTAINS, .expectationValue.message = "sent out Litten" },
{ .expectationType = EXPECTATION_TYPE_MESSAGE, .expectationValue.message = "Litten's Intimidate" },
{ .expectationType = EXPECTATION_TYPE_MESSAGE, .expectationValue.message = "Staraptor's Attack fell!" },
}
}
END_TEST
107 changes: 107 additions & 0 deletions data/battle_tests/abilities/emergency_exit/multihit.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
// Test: Emergency Exit - activates after last hit of a multi-hit move and falling under 50% max-hp
#include "../../battle_tests.h"
BEGIN_TEST
{
.battleType = BATTLE_TYPE_TRAINER,
.weather = FIELD_CONDITION_NONE,
.fieldCondition = 0,
.terrain = TERRAIN_NONE,
.playerParty = {
{
.species = SPECIES_BRELOOM,
.level = 50,
.form = 0,
.ability = ABILITY_SKILL_LINK,
.item = ITEM_NONE,
.moves = { MOVE_BULLET_SEED, MOVE_NONE, MOVE_NONE, MOVE_NONE },
.hp = FULL_HP,
.status = 0,
.condition2 = 0,
.moveEffectFlags = 0,
},
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE }
},
.enemyParty = { {
.species = SPECIES_GOLISOPOD,
.level = 50,
.form = 0,
.ability = ABILITY_EMERGENCY_EXIT,
.item = ITEM_NONE,
.moves = { MOVE_SLEEP_TALK, MOVE_NONE, MOVE_NONE, MOVE_NONE },
.hp = 95, //150
.status = 0,
.condition2 = 0,
.moveEffectFlags = 0,
},
{
.species = SPECIES_LITTEN,
.level = 50,
.form = 0,
.ability = ABILITY_INTIMIDATE,
.item = ITEM_NONE,
.moves = { MOVE_SLEEP_TALK, MOVE_NONE, MOVE_NONE, MOVE_NONE },
.hp = FULL_HP,
.status = 0,
.condition2 = 0,
.moveEffectFlags = 0,
},
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE },
{ .species = SPECIES_NONE } },
.playerScript = { {
{ ACTION_MOVE_SLOT_1, BATTLER_ENEMY_FIRST },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
},
{
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
} },
.enemyScript = { {
{ ACTION_MOVE_SLOT_1, BATTLER_PLAYER_FIRST },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
},
{
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
{ ACTION_NONE, 0 },
} },
.expectations = {
{ .expectationType = EXPECTATION_TYPE_HP_BAR, .battlerIDOrPartySlot = BATTLER_ENEMY_FIRST, .expectationValue.hpTaken = { 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 18 } },
{ .expectationType = EXPECTATION_TYPE_HP_BAR, .battlerIDOrPartySlot = BATTLER_ENEMY_FIRST, .expectationValue.hpTaken = { 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 18 } },
{ .expectationType = EXPECTATION_TYPE_HP_BAR, .battlerIDOrPartySlot = BATTLER_ENEMY_FIRST, .expectationValue.hpTaken = { 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 18 } },
{ .expectationType = EXPECTATION_TYPE_HP_BAR, .battlerIDOrPartySlot = BATTLER_ENEMY_FIRST, .expectationValue.hpTaken = { 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 18 } },
{ .expectationType = EXPECTATION_TYPE_HP_BAR, .battlerIDOrPartySlot = BATTLER_ENEMY_FIRST, .expectationValue.hpTaken = { 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 18 } },
{ .expectationType = EXPECTATION_TYPE_MESSAGE, .expectationValue.message = "Golisopod's EmergencyExit" },
{ .expectationType = EXPECTATION_TYPE_MESSAGE_CONTAINS, .expectationValue.message = "sent out Litten" },
{ .expectationType = EXPECTATION_TYPE_MESSAGE, .expectationValue.message = "Litten's Intimidate" },
}
}
END_TEST
Loading
Loading