From 2fb242d04156fdabe91a5bf94471e5f89cba626c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:40:07 +0100 Subject: [PATCH] Fixes Knock Off / Ogerpon behavior (#9478) --- src/battle_util.c | 10 +++-- test/battle/move_effect/knock_off.c | 70 +++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 1013960fab..23d650da64 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -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; diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index 8e46ee3151..f8b3f21037 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -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); + } +}