diff --git a/src/battle_main.c b/src/battle_main.c index c823f61634..8607e22e06 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3304,8 +3304,10 @@ const u8* FaintClearSetData(u32 battler) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; bool32 keepGastroAcid = gBattleMons[battler].volatiles.gastroAcid; + bool32 keepTransformed = gBattleMons[battler].volatiles.transformed; memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); gBattleMons[battler].volatiles.gastroAcid = keepGastroAcid; // Edge case: Keep Gastro Acid if pokemon's ability can have effect after fainting, for example Innards Out. + gBattleMons[battler].volatiles.transformed = keepTransformed; // Edge case: Keep Transformed status to prevent triggering FORM_CHANGE_FAINT on transformed mons. for (i = 0; i < gBattlersCount; i++) { diff --git a/test/battle/move_effect/transform.c b/test/battle/move_effect/transform.c index bf2bd66143..de98de70a6 100644 --- a/test/battle/move_effect/transform.c +++ b/test/battle/move_effect/transform.c @@ -28,3 +28,17 @@ SINGLE_BATTLE_TEST("(TERA) Transform does not copy the target's Tera Type, and i NOT { HP_BAR(opponent); } } } + +SINGLE_BATTLE_TEST("Transform returns the user to normal at the end of the battle after fainting") +{ + GIVEN { + PLAYER(SPECIES_DITTO) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEOT) { Item(ITEM_PIDGEOTITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(player, MOVE_TRANSFORM); } + TURN { MOVE(opponent, MOVE_SCRATCH); SEND_OUT(player, 1); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_DITTO); + } +}