From 918d45a6232ad2c29f93f655d001c68b12a7b9d8 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 22 Sep 2024 16:33:17 +0200 Subject: [PATCH] Fix default tera type changing upon evolution/form change (#5422) --- src/evolution_scene.c | 19 +++++++------------ src/pokemon.c | 2 ++ test/pokemon.c | 11 ++++++++--- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 98879430cb37..611949490794 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -545,19 +545,13 @@ static void CB2_TradeEvolutionSceneUpdate(void) static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) { u32 data = 0; - #if P_SHEDINJA_BALL >= GEN_4 - u16 ball = ITEM_POKE_BALL; - #endif + u16 ball = ITEM_POKE_BALL; const struct Evolution *evolutions = GetSpeciesEvolutions(preEvoSpecies); if (evolutions == NULL) return; - if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE - #if P_SHEDINJA_BALL >= GEN_4 - && (CheckBagHasItem(ball, 1)) - #endif - ) + if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE && (P_SHEDINJA_BALL < GEN_4 || CheckBagHasItem(ball, 1))) { s32 i; struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; @@ -567,10 +561,11 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, GetSpeciesName(evolutions[1].targetSpecies)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); - #if P_SHEDINJA_BALL >= GEN_4 - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); - RemoveBagItem(ball, 1); - #endif + if (P_SHEDINJA_BALL >= GEN_4) + { + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); + RemoveBagItem(ball, 1); + } for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++) SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); diff --git a/src/pokemon.c b/src/pokemon.c index 0583939a8531..e186ce4d51cd 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2791,6 +2791,8 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) { const u8 *types = gSpeciesInfo[substruct0->species].types; retVal = (boxMon->personality & 0x1) == 0 ? types[0] : types[1]; + // To avoid this value changing upon form change/evolution, we directly set it for future cases + SetBoxMonData(boxMon, MON_DATA_TERA_TYPE, &retVal); } else { diff --git a/test/pokemon.c b/test/pokemon.c index 8419b9c7e16f..562b8b10a37b 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -325,20 +325,25 @@ TEST("givemon [vars]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_TERA_TYPE), TYPE_FIRE); } -TEST("checkteratype/setteratype work") +TEST("checkteratype works") { CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); RUN_OVERWORLD_SCRIPT( checkteratype 0; ); - EXPECT(VarGet(VAR_RESULT) == TYPE_PSYCHIC); + EXPECT_EQ(VarGet(VAR_RESULT), TYPE_PSYCHIC); +} + +TEST("setteratype works") +{ + CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); RUN_OVERWORLD_SCRIPT( setteratype TYPE_FIRE, 0; checkteratype 0; ); - EXPECT(VarGet(VAR_RESULT) == TYPE_FIRE); + EXPECT_EQ(VarGet(VAR_RESULT), TYPE_FIRE); } TEST("createmon [simple]")