From fc872b481e77e07676e1d9021468c0016b52b9e1 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 27 Apr 2025 09:27:21 -0400 Subject: [PATCH] Fix `FORM_CHANGE_ITEM_HOLD` bug manifested during `givemon` (#6702) --- src/pokemon.c | 18 +++++++++++++++++- test/pokemon.c | 17 +++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/pokemon.c b/src/pokemon.c index f09dbacab5..300b57e81d 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6559,7 +6559,23 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 case FORM_CHANGE_ITEM_HOLD: if ((heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) && (ability == formChanges[i].param2 || formChanges[i].param2 == ABILITY_NONE)) - targetSpecies = formChanges[i].targetSpecies; + { + // This is to prevent reverting to base form when giving the item to the corresponding form. + // Eg. Giving a Zap Plate to an Electric Arceus without an item (most likely to happen when using givemon) + bool32 currentItemForm = FALSE; + for (int j = 0; formChanges[j].method != FORM_CHANGE_TERMINATOR; j++) + { + if (species == formChanges[j].targetSpecies + && formChanges[j].param1 == heldItem + && formChanges[j].param1 != ITEM_NONE) + { + currentItemForm = TRUE; + break; + } + } + if (!currentItemForm) + targetSpecies = formChanges[i].targetSpecies; + } break; case FORM_CHANGE_ITEM_USE: if (arg == formChanges[i].param1) diff --git a/test/pokemon.c b/test/pokemon.c index 16aadee798..dbb88081cf 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -256,6 +256,23 @@ TEST("givemon respects perfectIVCount") } } +TEST("givemon respects FORM_CHANGE_ITEM_HOLD") +{ + ZeroPlayerPartyMons(); + + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_ARCEUS_NORMAL, 100, item=ITEM_ZAP_PLATE; + givemon SPECIES_ARCEUS_GRASS, 100, item=ITEM_ZAP_PLATE; + givemon SPECIES_ARCEUS_ELECTRIC, 100, item=ITEM_ZAP_PLATE; + givemon SPECIES_GIRATINA_ORIGIN, 100, item=ITEM_POTION; + ); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_ARCEUS_ELECTRIC); + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_SPECIES), SPECIES_ARCEUS_ELECTRIC); + EXPECT_EQ(GetMonData(&gPlayerParty[2], MON_DATA_SPECIES), SPECIES_ARCEUS_ELECTRIC); + EXPECT_EQ(GetMonData(&gPlayerParty[3], MON_DATA_SPECIES), SPECIES_GIRATINA_ALTERED); +} + TEST("givemon [moves]") { ZeroPlayerPartyMons();