Fixes Fling being usable with reusable TMs (#8906)

This commit is contained in:
PhallenTree 2026-01-28 14:50:45 +00:00 committed by GitHub
parent edaa838a20
commit dd21d8fae4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 14 additions and 56 deletions

View File

@ -9810,6 +9810,7 @@ bool32 CanFling(u32 battler)
|| (GetConfig(CONFIG_KLUTZ_FLING_INTERACTION) >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ)
|| gFieldStatuses & STATUS_FIELD_MAGIC_ROOM
|| gBattleMons[battler].volatiles.embargo
|| (GetItemTMHMIndex(item) != 0 && GetItemImportance(item) == 1) // don't fling reusable TMs
|| GetFlingPowerFromItemId(item) == 0
|| !CanBattlerGetOrLoseItem(battler, item))
return FALSE;

View File

@ -119,7 +119,7 @@ SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when using Natural Gift")
}
}
SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when using Fling")
SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when user uses Fling")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING);

View File

@ -66,34 +66,7 @@ SINGLE_BATTLE_TEST("Corrosion does not effect poison type damaging moves if the
}
}
SINGLE_BATTLE_TEST("Corrosion can poison Poison- and Steel-type targets if it uses Fling while holding a Toxic Orb or a Poison Barb")
{
u16 heldItem;
PARAMETRIZE { heldItem = ITEM_POISON_BARB; }
PARAMETRIZE { heldItem = ITEM_TOXIC_ORB; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING);
ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_TYPE_POWER);
ASSUME(gItemsInfo[ITEM_POISON_BARB].secondaryId == TYPE_POISON);
ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB);
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(heldItem); }
OPPONENT(SPECIES_ODDISH);
} WHEN {
TURN { MOVE(player, MOVE_FLING); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player);
HP_BAR(opponent);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent);
if (heldItem == ITEM_POISON_BARB)
STATUS_ICON(opponent, poison: TRUE);
else
STATUS_ICON(opponent, badPoison: TRUE);
}
}
SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion holds a Toxic Orb, it will badly poison itself")
SINGLE_BATTLE_TEST("Corrosion badly poisons its Poison/Steel-type user who holds a Toxic Orb")
{
GIVEN {
ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB);
@ -107,7 +80,7 @@ SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion holds a T
}
}
SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion poisons a target with Synchronize, Synchronize will not poison Poison- or Steel-type Pokémon")
SINGLE_BATTLE_TEST("Corrosion can poison a target with Synchronize and Synchronize will not poison Poison- or Steel-type Pokémon")
{
u16 move;
PARAMETRIZE { move = MOVE_TOXIC; }

View File

@ -507,7 +507,7 @@ SINGLE_BATTLE_TEST("Fling deals damage based on items fling power")
}
}
SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power")
SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power if reusable or fails if breakable")
{
s16 damage[2];
@ -520,33 +520,17 @@ SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power")
TURN { MOVE(player, MOVE_FLING); }
TURN { MOVE(player, MOVE_EGG_BOMB); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player);
HP_BAR(opponent, captureDamage: &damage[0]);
if (GetItemImportance(ITEM_TM_EARTHQUAKE) == 0) {
ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player);
HP_BAR(opponent, captureDamage: &damage[0]);
} else {
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player);
MESSAGE("But it failed!");
}
ANIMATION(ANIM_TYPE_MOVE, MOVE_EGG_BOMB, player);
HP_BAR(opponent, captureDamage: &damage[1]);
} THEN {
EXPECT_EQ(damage[0], damage[1]);
}
}
SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power")
{
s16 damage[2];
GIVEN {
ASSUME(GetMovePower(MOVE_EARTHQUAKE) == GetMovePower(MOVE_EGG_BOMB));
ASSUME(!IsSpeciesOfType(SPECIES_WOBBUFFET, TYPE_DARK));
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_TM_EARTHQUAKE); }
OPPONENT(SPECIES_HIPPOWDON);
} WHEN {
TURN { MOVE(player, MOVE_FLING); }
TURN { MOVE(player, MOVE_EGG_BOMB); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player);
HP_BAR(opponent, captureDamage: &damage[0]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EGG_BOMB, player);
HP_BAR(opponent, captureDamage: &damage[1]);
} THEN {
EXPECT_EQ(damage[0], damage[1]);
if (GetItemImportance(ITEM_TM_EARTHQUAKE) == 0)
EXPECT_EQ(damage[0], damage[1]);
}
}