From 0fd08a32ac64d57e8462e2c4bf461ada22a7c1c8 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Fri, 15 Dec 2023 11:17:35 +0100 Subject: [PATCH] Add status form change --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 2 ++ include/constants/form_change_types.h | 4 ++++ src/battle_script_commands.c | 13 +++++++++++++ src/battle_util.c | 4 ++++ src/data/pokemon/form_change_tables.h | 1 + src/pokemon.c | 1 + test/battle/form_change/status.c | 15 +++++++++++++++ 8 files changed, 44 insertions(+) create mode 100644 test/battle/form_change/status.c diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b60b7faf74..a29b5f62e8 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1557,6 +1557,10 @@ .4byte \failInstr .endm + .macro trytriggerstatusform + callnative BS_TryTriggerStatusForm + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d057ca5092..4f8d7c34d9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8342,6 +8342,8 @@ BattleScript_MoveEffectSleep:: BattleScript_UpdateEffectStatusIconRet:: updatestatusicon BS_EFFECT_BATTLER waitstate + trytriggerstatusform + flushtextbox return BattleScript_YawnMakesAsleep:: diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index 654710c1ef..51325baf25 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -116,4 +116,8 @@ // param1: multichoice list (starting at 0). #define FORM_CHANGE_ITEM_USE_MULTICHOICE 19 +// Form change that activates when inflicted with a specific status +// param1: status +#define FORM_CHANGE_STATUS 20 + #endif // GUARD_CONSTANTS_FORM_CHANGE_TYPES_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6eead682a4..cfa2959f75 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16496,3 +16496,16 @@ void BS_TryDefog(void) gBattlescriptCurrInstr = cmd->failInstr; } } + +void BS_TryTriggerStatusForm(void) +{ + NATIVE_ARGS(); + if (TryBattleFormChange(gBattlerTarget, FORM_CHANGE_STATUS)) + { + gBattleScripting.battler = gBattlerTarget; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_TargetFormChangeWithStringNoPopup; + return; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} diff --git a/src/battle_util.c b/src/battle_util.c index 0d30acbdc0..4c29d20c72 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10494,6 +10494,10 @@ u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method) if (formChanges[i].param1 == GetBattlerAbility(battler)) targetSpecies = formChanges[i].targetSpecies; break; + case FORM_CHANGE_STATUS: + if (gBattleMons[battler].status1 & formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; } } } diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index d86ff4ea90..3720770a1f 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -489,6 +489,7 @@ static const struct FormChange sShayminFormChangeTable[] = { {FORM_CHANGE_ITEM_USE, SPECIES_SHAYMIN_SKY, ITEM_GRACIDEA, DAY}, {FORM_CHANGE_WITHDRAW, SPECIES_SHAYMIN_LAND}, {FORM_CHANGE_TIME_OF_DAY, SPECIES_SHAYMIN_LAND, NIGHT}, + {FORM_CHANGE_STATUS, SPECIES_SHAYMIN_LAND, (STATUS1_FREEZE | STATUS1_FROSTBITE)}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SHAYMIN diff --git a/src/pokemon.c b/src/pokemon.c index 9605b1e4aa..c6b1c0dae6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5821,6 +5821,7 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 break; case FORM_CHANGE_WITHDRAW: case FORM_CHANGE_FAINT: + case FORM_CHANGE_STATUS: targetSpecies = formChanges[i].targetSpecies; break; case FORM_CHANGE_TIME_OF_DAY: diff --git a/test/battle/form_change/status.c b/test/battle/form_change/status.c new file mode 100644 index 0000000000..a8f286846a --- /dev/null +++ b/test/battle/form_change/status.c @@ -0,0 +1,15 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Shaymin-Sky reverts to Shaymin-Land when frozen or frostbitten") +{ + ASSUME(gBattleMoves[MOVE_POWDER_SNOW].effect == ((B_USE_FROSTBITE == TRUE) ? EFFECT_FROSTBITE_HIT : EFFECT_FREEZE_HIT)); + GIVEN { + PLAYER(SPECIES_SHAYMIN_SKY); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER_SNOW); } + } THEN { + EXPECT_EQ(player->species, SPECIES_SHAYMIN_LAND); + } +}