Fix FORM_CHANGE_ITEM_HOLD bug manifested during givemon (#6702)

This commit is contained in:
Eduardo Quezada 2025-04-27 09:27:21 -04:00 committed by GitHub
parent 1cd4d23969
commit fc872b481e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 1 deletions

View File

@ -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)

View File

@ -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();