diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1f066d77a8..f20e13e8ae 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6994,6 +6994,13 @@ BattleScript_CudChewActivates:: setbyte sBERRY_OVERRIDE, 0 end3 +BattleScript_ApplyDisguiseFormChangeHPLoss:: +.if B_DISGUISE_HP_LOSS >= GEN_8 + healthbarupdate BS_SCRIPTING + datahpupdate BS_SCRIPTING +.endif + return + BattleScript_TargetFormChangeNoPopup: flushtextbox handleformchange BS_SCRIPTING, 0 @@ -7001,10 +7008,7 @@ BattleScript_TargetFormChangeNoPopup: playanimation BS_TARGET, B_ANIM_FORM_CHANGE waitanimation handleformchange BS_SCRIPTING, 2 -.if B_DISGUISE_HP_LOSS >= GEN_8 - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING -.endif + jumpifability BS_TARGET, ABILITY_DISGUISE, BattleScript_ApplyDisguiseFormChangeHPLoss return BattleScript_TargetFormChange:: diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 8eb96e04b0..0b8eb485a9 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -627,7 +627,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_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 b02eb87d93..0d2e3c5fd3 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6226,9 +6226,12 @@ 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_STATUS: + if (GetBoxMonData(boxMon, MON_DATA_STATUS, NULL) & formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; case FORM_CHANGE_TIME_OF_DAY: switch (formChanges[i].param1) { diff --git a/test/battle/form_change/status.c b/test/battle/form_change/status.c index b264ba3dd5..f0d5a9f3f0 100644 --- a/test/battle/form_change/status.c +++ b/test/battle/form_change/status.c @@ -3,13 +3,38 @@ SINGLE_BATTLE_TEST("Shaymin-Sky reverts to Shaymin-Land when frozen or frostbitten") { + u32 move; + + PARAMETRIZE { move = MOVE_POWDER_SNOW; } + PARAMETRIZE { move = MOVE_EMBER; } + PARAMETRIZE { move = MOVE_THUNDERSHOCK; } + PARAMETRIZE { move = MOVE_POISON_STING; } + PARAMETRIZE { move = MOVE_POISON_FANG; } + ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE)); + ASSUME(MoveHasAdditionalEffect(MOVE_EMBER, MOVE_EFFECT_BURN)); + ASSUME(MoveHasAdditionalEffect(MOVE_THUNDERSHOCK, MOVE_EFFECT_PARALYSIS)); + ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON)); + ASSUME(MoveHasAdditionalEffect(MOVE_POISON_FANG, MOVE_EFFECT_TOXIC)); GIVEN { PLAYER(SPECIES_SHAYMIN_SKY); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_POWDER_SNOW); } + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (move == MOVE_POWDER_SNOW) { + STATUS_ICON(player, freeze: TRUE); + NOT HP_BAR(player); // Regression caused by Mimikyu form change + MESSAGE("Shaymin transformed!"); + } else { + NOT MESSAGE("Shaymin transformed!"); + } } THEN { - EXPECT_EQ(player->species, SPECIES_SHAYMIN_LAND); + if (move == MOVE_POWDER_SNOW) + EXPECT_EQ(player->species, SPECIES_SHAYMIN_LAND); + else + EXPECT_EQ(player->species, SPECIES_SHAYMIN_SKY); + } }