Fixes Knock Off / Ogerpon behavior (#9478)
Some checks are pending
CI / build (push) Waiting to run
CI / docs_validate (push) Waiting to run
CI / allcontributors (push) Waiting to run
Docs / deploy (push) Waiting to run

This commit is contained in:
Alex 2026-03-08 20:40:07 +01:00 committed by GitHub
parent 8e89d71b52
commit 2fb242d041
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 77 additions and 3 deletions

View File

@ -8843,19 +8843,23 @@ bool32 DoBattlersShareType(enum BattlerId battler1, enum BattlerId battler2)
bool32 CanBattlerGetOrLoseItem(enum BattlerId fromBattler, enum BattlerId battler, enum Item itemId)
{
u16 species = gBattleMons[fromBattler].species;
u32 fromSpecies = gBattleMons[fromBattler].species;
u32 otherSpecies = gBattleMons[battler].species;
enum HoldEffect holdEffect = GetItemHoldEffect(itemId); // Raw hold effect
if (ItemIsMail(itemId))
return FALSE;
else if (itemId == ITEM_ENIGMA_BERRY_E_READER)
return FALSE;
else if (DoesSpeciesUseHoldItemToChangeForm(species, itemId))
else if (DoesSpeciesUseHoldItemToChangeForm(fromSpecies, itemId))
return FALSE;
else if (holdEffect == HOLD_EFFECT_Z_CRYSTAL)
return FALSE;
else if (holdEffect == HOLD_EFFECT_BOOSTER_ENERGY
&& (gSpeciesInfo[gBattleMons[fromBattler].species].isParadox || gSpeciesInfo[gBattleMons[battler].species].isParadox))
&& (gSpeciesInfo[fromSpecies].isParadox || gSpeciesInfo[otherSpecies].isParadox))
return FALSE;
else if (holdEffect == HOLD_EFFECT_OGERPON_MASK && GET_BASE_SPECIES_ID(fromSpecies) == SPECIES_OGERPON)
return FALSE;
else
return TRUE;

View File

@ -437,3 +437,73 @@ SINGLE_BATTLE_TEST("Knock Off does not activate if the item was previously consu
EXPECT(opponent->item == ITEM_NONE);
}
}
SINGLE_BATTLE_TEST("Knock Off does knock off Ogerpon masks from Pokemon that aren't Ogerpon")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HEARTHFLAME_MASK); }
} WHEN {
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); }
} SCENE {
MESSAGE("Wobbuffet knocked off the opposing Wobbuffet's Hearthflame Mask!");
} THEN {
EXPECT(opponent->item == ITEM_NONE);
}
}
SINGLE_BATTLE_TEST("Knock Off doesn't knock off Ogerpon masks from Ogerpon")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_OGERPON) { Item(ITEM_HEARTHFLAME_MASK); }
} WHEN {
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); }
} SCENE {
NOT MESSAGE("Wobbuffet knocked off the opposing Ogerpon's Hearthflame Mask!");
} THEN {
EXPECT(opponent->item == ITEM_HEARTHFLAME_MASK);
}
}
SINGLE_BATTLE_TEST("Knock Off does knock off a Booster Energy from a non Paradox Pokemon")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_BOOSTER_ENERGY); }
} WHEN {
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); }
} SCENE {
MESSAGE("Wobbuffet knocked off the opposing Wobbuffet's Booster Energy!");
} THEN {
EXPECT(opponent->item == ITEM_NONE);
}
}
SINGLE_BATTLE_TEST("Knock Off doesn't knock off a Paradox mon's Booster Energy")
{
GIVEN {
PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); }
OPPONENT(SPECIES_GREAT_TUSK) { Item(ITEM_BOOSTER_ENERGY); }
} WHEN {
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); }
} SCENE {
NOT MESSAGE("Wobbuffet knocked off the opposing Great Tusk's Booster Energy!");
} THEN {
EXPECT(opponent->item == ITEM_BOOSTER_ENERGY);
}
}
SINGLE_BATTLE_TEST("Knock Off used by a Paradox mon doesn't knock off a non-Paradox mon's Booster Energy")
{
GIVEN {
PLAYER(SPECIES_GREAT_TUSK);
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_BOOSTER_ENERGY); }
} WHEN {
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); }
} SCENE {
NOT MESSAGE("Great Tust knocked off the opposing Wobbuffet's Booster Energy!");
} THEN {
EXPECT(opponent->item == ITEM_BOOSTER_ENERGY);
}
}