diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index adc9fcc195..2c19ebb515 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2322,9 +2322,10 @@ .4byte \jumpInstr .endm - .macro jumpiflastuseditemholdeffect battler:req, holdEffect:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT + .macro jumpiflastuseditemholdeffect holdEffect:req, secondaryId:req, jumpInstr:req + callnative BS_JumpIfLastUsedItemHoldEffect .byte \holdEffect + .2byte \secondaryId .4byte \jumpInstr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 22e8395e4a..1cf302afc4 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -774,13 +774,13 @@ BattleScript_EffectFling:: waitmessage B_WAIT_TIME_MED jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry jumpifability BS_TARGET, ABILITY_SHIELD_DUST, BattleScript_FlingBlockedByShieldDust - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLAME_ORB, BattleScript_FlingFlameOrb - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLINCH, BattleScript_FlingFlinch - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_LIGHT_BALL, BattleScript_FlingLightBall - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_MENTAL_HERB, BattleScript_FlingMentalHerb - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_POISON_POWER, BattleScript_FlingPoisonBarb - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_TOXIC_ORB, BattleScript_FlingToxicOrb - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_WHITE_HERB, BattleScript_FlingWhiteHerb + jumpiflastuseditemholdeffect HOLD_EFFECT_FLAME_ORB, 0, BattleScript_FlingFlameOrb + jumpiflastuseditemholdeffect HOLD_EFFECT_FLINCH, 0, BattleScript_FlingFlinch + jumpiflastuseditemholdeffect HOLD_EFFECT_LIGHT_BALL, 0, BattleScript_FlingLightBall + jumpiflastuseditemholdeffect HOLD_EFFECT_MENTAL_HERB, 0, BattleScript_FlingMentalHerb + jumpiflastuseditemholdeffect HOLD_EFFECT_TYPE_POWER, TYPE_POISON, BattleScript_FlingPoisonBarb + jumpiflastuseditemholdeffect HOLD_EFFECT_TOXIC_ORB, 0, BattleScript_FlingToxicOrb + jumpiflastuseditemholdeffect HOLD_EFFECT_WHITE_HERB, 0, BattleScript_FlingWhiteHerb goto BattleScript_FlingEnd BattleScript_EffectFlingConsumeBerry: savebattleritem BS_TARGET diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 051a49b076..34fc40452f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -203,7 +203,6 @@ enum CmdVarious VARIOUS_CURE_CERTAIN_STATUSES, VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES, VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY, - VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT, VARIOUS_SAVE_BATTLER_ITEM, VARIOUS_RESTORE_BATTLER_ITEM, VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM, diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 096d9ad624..c7ed811601 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -34,7 +34,6 @@ enum ItemHoldEffect HOLD_EFFECT_MENTAL_HERB, HOLD_EFFECT_CHOICE_BAND, HOLD_EFFECT_FLINCH, - HOLD_EFFECT_BUG_POWER, HOLD_EFFECT_DOUBLE_PRIZE, HOLD_EFFECT_REPEL, HOLD_EFFECT_SOUL_DEW, @@ -45,25 +44,10 @@ enum ItemHoldEffect HOLD_EFFECT_FOCUS_BAND, HOLD_EFFECT_LUCKY_EGG, HOLD_EFFECT_SCOPE_LENS, - HOLD_EFFECT_STEEL_POWER, HOLD_EFFECT_LEFTOVERS, HOLD_EFFECT_DRAGON_SCALE, HOLD_EFFECT_LIGHT_BALL, - HOLD_EFFECT_GROUND_POWER, - HOLD_EFFECT_ROCK_POWER, - HOLD_EFFECT_GRASS_POWER, - HOLD_EFFECT_DARK_POWER, - HOLD_EFFECT_FIGHTING_POWER, - HOLD_EFFECT_ELECTRIC_POWER, - HOLD_EFFECT_WATER_POWER, - HOLD_EFFECT_FLYING_POWER, - HOLD_EFFECT_POISON_POWER, - HOLD_EFFECT_ICE_POWER, - HOLD_EFFECT_GHOST_POWER, - HOLD_EFFECT_PSYCHIC_POWER, - HOLD_EFFECT_FIRE_POWER, - HOLD_EFFECT_DRAGON_POWER, - HOLD_EFFECT_NORMAL_POWER, + HOLD_EFFECT_TYPE_POWER, HOLD_EFFECT_UPGRADE, HOLD_EFFECT_SHELL_BELL, HOLD_EFFECT_LUCKY_PUNCH, @@ -127,7 +111,6 @@ enum ItemHoldEffect HOLD_EFFECT_ABSORB_BULB, HOLD_EFFECT_CELL_BATTERY, // Gen6 hold effects - HOLD_EFFECT_FAIRY_POWER, HOLD_EFFECT_MEGA_STONE, HOLD_EFFECT_SAFETY_GOGGLES, HOLD_EFFECT_LUMINOUS_MOSS, diff --git a/src/battle_debug.c b/src/battle_debug.c index 2f83f1d4ab..b70441c353 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -2339,7 +2339,6 @@ static const u8 sText_HoldEffectFriendshipUp[] = _("Friendship Up"); static const u8 sText_HoldEffectMentalHerb[] = _("Mental Herb"); static const u8 sText_HoldEffectChoiceBand[] = _("Choice Band"); static const u8 sText_HoldEffectFlinch[] = _("Flinch"); -static const u8 sText_HoldEffectBugPower[] = _("Bug Power"); static const u8 sText_HoldEffectDoublePrize[] = _("Double Prize"); static const u8 sText_HoldEffectRepel[] = _("Repel"); static const u8 sText_HoldEffectSoulDew[] = _("Soul Dew"); @@ -2350,25 +2349,10 @@ static const u8 sText_HoldEffectPreventEvolve[] = _("Prevent Evolve"); static const u8 sText_HoldEffectFocusBand[] = _("Focus Band"); static const u8 sText_HoldEffectLuckyEgg[] = _("Lucky Egg"); static const u8 sText_HoldEffectScopeLens[] = _("Scope Lens"); -static const u8 sText_HoldEffectSteelPower[] = _("Steel Power"); static const u8 sText_HoldEffectLeftovers[] = _("Leftovers"); static const u8 sText_HoldEffectDragonScale[] = _("Dragon Scale"); static const u8 sText_HoldEffectLightBall[] = _("Light Ball"); -static const u8 sText_HoldEffectGroundPower[] = _("Ground Power"); -static const u8 sText_HoldEffectRockPower[] = _("Rock Power"); -static const u8 sText_HoldEffectGrassPower[] = _("Grass Power"); -static const u8 sText_HoldEffectDarkPower[] = _("Dark Power"); -static const u8 sText_HoldEffectFightingPower[] = _("Fighting Power"); -static const u8 sText_HoldEffectElectricPower[] = _("Electric Power"); -static const u8 sText_HoldEffectWaterPower[] = _("Water Power"); -static const u8 sText_HoldEffectFlyingPower[] = _("Flying Power"); -static const u8 sText_HoldEffectPoisonPower[] = _("Poison Power"); -static const u8 sText_HoldEffectIcePower[] = _("Ice Power"); -static const u8 sText_HoldEffectGhostPower[] = _("Ghost Power"); -static const u8 sText_HoldEffectPsychicPower[] = _("Psychic Power"); -static const u8 sText_HoldEffectFirePower[] = _("Fire Power"); -static const u8 sText_HoldEffectDragonPower[] = _("Dragon Power"); -static const u8 sText_HoldEffectNormalPower[] = _("Normal Power"); +static const u8 sText_HoldEffectTypePower[] = _("Type Power"); static const u8 sText_HoldEffectUpgrade[] = _("Upgrade"); static const u8 sText_HoldEffectShellBell[] = _("Shell Bell"); static const u8 sText_HoldEffectLuckyPunch[] = _("Lucky Punch"); @@ -2428,7 +2412,6 @@ static const u8 sText_HoldEffectBindingBand[] = _("Binding Band"); static const u8 sText_HoldEffectEjectButton[] = _("Eject Button"); static const u8 sText_HoldEffectAbsorbBulb[] = _("Absorb Bulb"); static const u8 sText_HoldEffectCellBattery[] = _("Cell Battery"); -static const u8 sText_HoldEffectFairyPower[] = _("Fairy Power"); static const u8 sText_HoldEffectMegaStone[] = _("Mega Stone"); static const u8 sText_HoldEffectSafetyGoggles[] = _("Safety Goggles"); static const u8 sText_HoldEffectLuminousMoss[] = _("Luminous Moss"); @@ -2490,7 +2473,6 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_MENTAL_HERB] = sText_HoldEffectMentalHerb, [HOLD_EFFECT_CHOICE_BAND] = sText_HoldEffectChoiceBand, [HOLD_EFFECT_FLINCH] = sText_HoldEffectFlinch, - [HOLD_EFFECT_BUG_POWER] = sText_HoldEffectBugPower, [HOLD_EFFECT_DOUBLE_PRIZE] = sText_HoldEffectDoublePrize, [HOLD_EFFECT_REPEL] = sText_HoldEffectRepel, [HOLD_EFFECT_SOUL_DEW] = sText_HoldEffectSoulDew, @@ -2501,25 +2483,10 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_FOCUS_BAND] = sText_HoldEffectFocusBand, [HOLD_EFFECT_LUCKY_EGG] = sText_HoldEffectLuckyEgg, [HOLD_EFFECT_SCOPE_LENS] = sText_HoldEffectScopeLens, - [HOLD_EFFECT_STEEL_POWER] = sText_HoldEffectSteelPower, [HOLD_EFFECT_LEFTOVERS] = sText_HoldEffectLeftovers, [HOLD_EFFECT_DRAGON_SCALE] = sText_HoldEffectDragonScale, [HOLD_EFFECT_LIGHT_BALL] = sText_HoldEffectLightBall, - [HOLD_EFFECT_GROUND_POWER] = sText_HoldEffectGroundPower, - [HOLD_EFFECT_ROCK_POWER] = sText_HoldEffectRockPower, - [HOLD_EFFECT_GRASS_POWER] = sText_HoldEffectGrassPower, - [HOLD_EFFECT_DARK_POWER] = sText_HoldEffectDarkPower, - [HOLD_EFFECT_FIGHTING_POWER] = sText_HoldEffectFightingPower, - [HOLD_EFFECT_ELECTRIC_POWER] = sText_HoldEffectElectricPower, - [HOLD_EFFECT_WATER_POWER] = sText_HoldEffectWaterPower, - [HOLD_EFFECT_FLYING_POWER] = sText_HoldEffectFlyingPower, - [HOLD_EFFECT_POISON_POWER] = sText_HoldEffectPoisonPower, - [HOLD_EFFECT_ICE_POWER] = sText_HoldEffectIcePower, - [HOLD_EFFECT_GHOST_POWER] = sText_HoldEffectGhostPower, - [HOLD_EFFECT_PSYCHIC_POWER] = sText_HoldEffectPsychicPower, - [HOLD_EFFECT_FIRE_POWER] = sText_HoldEffectFirePower, - [HOLD_EFFECT_DRAGON_POWER] = sText_HoldEffectDragonPower, - [HOLD_EFFECT_NORMAL_POWER] = sText_HoldEffectNormalPower, + [HOLD_EFFECT_TYPE_POWER] = sText_HoldEffectTypePower, [HOLD_EFFECT_UPGRADE] = sText_HoldEffectUpgrade, [HOLD_EFFECT_SHELL_BELL] = sText_HoldEffectShellBell, [HOLD_EFFECT_LUCKY_PUNCH] = sText_HoldEffectLuckyPunch, @@ -2580,7 +2547,6 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_EJECT_BUTTON] = sText_HoldEffectEjectButton, [HOLD_EFFECT_ABSORB_BULB] = sText_HoldEffectAbsorbBulb, [HOLD_EFFECT_CELL_BATTERY] = sText_HoldEffectCellBattery, - [HOLD_EFFECT_FAIRY_POWER] = sText_HoldEffectFairyPower, [HOLD_EFFECT_MEGA_STONE] = sText_HoldEffectMegaStone, [HOLD_EFFECT_SAFETY_GOGGLES] = sText_HoldEffectSafetyGoggles, [HOLD_EFFECT_LUMINOUS_MOSS] = sText_HoldEffectLuminousMoss, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e077892cbc..08fa177a03 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11586,15 +11586,6 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->nextInstr; return; } - case VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT: - { - VARIOUS_ARGS(u8 holdEffect, const u8 *jumpInstr); - if (ItemId_GetHoldEffect(gLastUsedItem) == cmd->holdEffect) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } case VARIOUS_SAVE_BATTLER_ITEM: { VARIOUS_ARGS(); @@ -18683,3 +18674,13 @@ void BS_JumpIfCanGigantamax(void) else gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_JumpIfLastUsedItemHoldEffect(void) +{ + NATIVE_ARGS(u8 holdEffect, u16 secondaryId, const u8 *jumpInstr); + if (ItemId_GetHoldEffect(gLastUsedItem) == cmd->holdEffect + && (cmd->secondaryId == 0 || ItemId_GetSecondaryId(gLastUsedItem) == cmd->secondaryId)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} diff --git a/src/battle_util.c b/src/battle_util.c index 1a899e6145..2e104dcf46 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -917,28 +917,6 @@ void HandleAction_ActionFinished(void) } } -static const u8 sHoldEffectToType[][2] = -{ - {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, - {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, - {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, - {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, - {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, - {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, - {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, - {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, - {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, - {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, - {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, - {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, - {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, - {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, - {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, - {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, - {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL}, - {HOLD_EFFECT_FAIRY_POWER, TYPE_FAIRY}, -}; - // code ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent) @@ -8320,7 +8298,6 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectAtk, u32 weather) { - u32 i; u32 holdEffectParamAtk; u32 basePower = CalcMoveBasePower(damageCalcData, defAbility, weather); u32 battlerAtk = damageCalcData->battlerAtk; @@ -8595,34 +8572,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * || (B_SOUL_DEW_BOOST < GEN_7 && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && IsBattleMoveSpecial(move)))) modifier = uq4_12_multiply(modifier, holdEffectModifier); break; - case HOLD_EFFECT_BUG_POWER: - case HOLD_EFFECT_STEEL_POWER: - case HOLD_EFFECT_GROUND_POWER: - case HOLD_EFFECT_ROCK_POWER: - case HOLD_EFFECT_GRASS_POWER: - case HOLD_EFFECT_DARK_POWER: - case HOLD_EFFECT_FIGHTING_POWER: - case HOLD_EFFECT_ELECTRIC_POWER: - case HOLD_EFFECT_WATER_POWER: - case HOLD_EFFECT_FLYING_POWER: - case HOLD_EFFECT_POISON_POWER: - case HOLD_EFFECT_ICE_POWER: - case HOLD_EFFECT_GHOST_POWER: - case HOLD_EFFECT_PSYCHIC_POWER: - case HOLD_EFFECT_FIRE_POWER: - case HOLD_EFFECT_DRAGON_POWER: - case HOLD_EFFECT_NORMAL_POWER: - case HOLD_EFFECT_FAIRY_POWER: - for (i = 0; i < ARRAY_COUNT(sHoldEffectToType); i++) - { - if (holdEffectAtk == sHoldEffectToType[i][0]) - { - if (moveType == sHoldEffectToType[i][1]) - modifier = uq4_12_multiply(modifier, holdEffectModifier); - break; - } - } - break; + case HOLD_EFFECT_TYPE_POWER: case HOLD_EFFECT_PLATE: if (moveType == ItemId_GetSecondaryId(gBattleMons[battlerAtk].item)) modifier = uq4_12_multiply(modifier, holdEffectModifier); diff --git a/src/data/items.h b/src/data/items.h index 696c5f9954..187b4bc399 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -7200,12 +7200,13 @@ const struct Item gItemsInfo[] = { .name = _("Sea Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_WATER_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_WATER, .flingPower = 10, .iconPic = gItemIcon_SeaIncense, .iconPalette = gItemIconPalette_SeaIncense, @@ -7233,12 +7234,13 @@ const struct Item gItemsInfo[] = { .name = _("Odd Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sOddIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_PSYCHIC, .flingPower = 10, .iconPic = gItemIcon_OddIncense, .iconPalette = gItemIconPalette_OddIncense, @@ -7248,12 +7250,13 @@ const struct Item gItemsInfo[] = { .name = _("Rock Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_ROCK_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sRockIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_ROCK, .flingPower = 10, .iconPic = gItemIcon_RockIncense, .iconPalette = gItemIconPalette_RockIncense, @@ -7278,12 +7281,13 @@ const struct Item gItemsInfo[] = { .name = _("Wave Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_WATER_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_WATER, .flingPower = 10, .iconPic = gItemIcon_WaveIncense, .iconPalette = gItemIconPalette_WaveIncense, @@ -7293,12 +7297,13 @@ const struct Item gItemsInfo[] = { .name = _("Rose Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_GRASS_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sRoseIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_GRASS, .flingPower = 10, .iconPic = gItemIcon_RoseIncense, .iconPalette = gItemIconPalette_RoseIncense, @@ -7560,7 +7565,7 @@ const struct Item gItemsInfo[] = .name = _("Silk Scarf"), .pluralName = _("Silk Scarves"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_NORMAL_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7569,6 +7574,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_NORMAL, .flingPower = 10, .iconPic = gItemIcon_SilkScarf, .iconPalette = gItemIconPalette_SilkScarf, @@ -7578,7 +7584,7 @@ const struct Item gItemsInfo[] = { .name = _("Charcoal"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 9800), - .holdEffect = HOLD_EFFECT_FIRE_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7587,6 +7593,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_FIRE, .flingPower = 30, .iconPic = gItemIcon_Charcoal, .iconPalette = gItemIconPalette_Charcoal, @@ -7597,7 +7604,7 @@ const struct Item gItemsInfo[] = .name = _("Mystic Water"), .pluralName = _("Mystic Water"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_WATER_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7606,6 +7613,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_WATER, .flingPower = 30, .iconPic = gItemIcon_MysticWater, .iconPalette = gItemIconPalette_MysticWater, @@ -7615,7 +7623,7 @@ const struct Item gItemsInfo[] = { .name = _("Magnet"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_ELECTRIC_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7624,6 +7632,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_ELECTRIC, .flingPower = 30, .iconPic = gItemIcon_Magnet, .iconPalette = gItemIconPalette_Magnet, @@ -7633,12 +7642,13 @@ const struct Item gItemsInfo[] = { .name = _("Miracle Seed"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_GRASS_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sRoseIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_GRASS, .flingPower = 30, .iconPic = gItemIcon_MiracleSeed, .iconPalette = gItemIconPalette_MiracleSeed, @@ -7649,7 +7659,7 @@ const struct Item gItemsInfo[] = .name = _("Never-Melt Ice"), .pluralName = _("Never-Melt Ice"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_ICE_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7658,6 +7668,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_ICE, .flingPower = 30, .iconPic = gItemIcon_NeverMeltIce, .iconPalette = gItemIconPalette_NeverMeltIce, @@ -7667,7 +7678,7 @@ const struct Item gItemsInfo[] = { .name = _("Black Belt"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_FIGHTING_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7676,6 +7687,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_FIGHTING, .flingPower = 30, .iconPic = gItemIcon_BlackBelt, .iconPalette = gItemIconPalette_BlackTypeEnhancingItem, @@ -7685,7 +7697,7 @@ const struct Item gItemsInfo[] = { .name = _("Poison Barb"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_POISON_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7694,6 +7706,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_POISON, .flingPower = 70, .iconPic = gItemIcon_PoisonBarb, .iconPalette = gItemIconPalette_PoisonBarb, @@ -7704,7 +7717,7 @@ const struct Item gItemsInfo[] = .name = _("Soft Sand"), .pluralName = _("Soft Sand"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_GROUND_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7713,6 +7726,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_GROUND, .flingPower = 10, .iconPic = gItemIcon_SoftSand, .iconPalette = gItemIconPalette_SoftSand, @@ -7722,7 +7736,7 @@ const struct Item gItemsInfo[] = { .name = _("Sharp Beak"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_FLYING_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7731,6 +7745,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_FLYING, .flingPower = 50, .iconPic = gItemIcon_SharpBeak, .iconPalette = gItemIconPalette_SharpBeak, @@ -7740,12 +7755,13 @@ const struct Item gItemsInfo[] = { .name = _("Twisted Spoon"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sOddIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_PSYCHIC, .flingPower = 30, .iconPic = gItemIcon_TwistedSpoon, .iconPalette = gItemIconPalette_TwistedSpoon, @@ -7756,7 +7772,7 @@ const struct Item gItemsInfo[] = .name = _("Silver Powder"), .pluralName = _("Silver Powder"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_BUG_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7765,6 +7781,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_BUG, .flingPower = 10, .iconPic = gItemIcon_SilverPowder, .iconPalette = gItemIconPalette_SilverPowder, @@ -7774,12 +7791,13 @@ const struct Item gItemsInfo[] = { .name = _("Hard Stone"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_ROCK_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sRockIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_ROCK, .flingPower = 100, .iconPic = gItemIcon_HardStone, .iconPalette = gItemIconPalette_HardStone, @@ -7789,7 +7807,7 @@ const struct Item gItemsInfo[] = { .name = _("Spell Tag"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_GHOST_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7798,6 +7816,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_GHOST, .flingPower = 30, .iconPic = gItemIcon_SpellTag, .iconPalette = gItemIconPalette_SpellTag, @@ -7807,7 +7826,7 @@ const struct Item gItemsInfo[] = { .name = _("Dragon Fang"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_DRAGON_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7816,6 +7835,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_DRAGON, .flingPower = 70, .iconPic = gItemIcon_DragonFang, .iconPalette = gItemIconPalette_DragonFang, @@ -7826,7 +7846,7 @@ const struct Item gItemsInfo[] = .name = _("Black Glasses"), .pluralName = _("Black Glasses"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_DARK_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7835,6 +7855,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_DARK, .flingPower = 30, .iconPic = gItemIcon_BlackGlasses, .iconPalette = gItemIconPalette_BlackTypeEnhancingItem, @@ -7844,7 +7865,7 @@ const struct Item gItemsInfo[] = { .name = _("Metal Coat"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 2000 : 100), - .holdEffect = HOLD_EFFECT_STEEL_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7854,6 +7875,7 @@ const struct Item gItemsInfo[] = .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, + .secondaryId = TYPE_STEEL, .flingPower = 30, .iconPic = gItemIcon_MetalCoat, .iconPalette = gItemIconPalette_MetalCoat, @@ -13631,7 +13653,7 @@ const struct Item gItemsInfo[] = { .name = _("Fairy Feather"), .price = 1000, - .holdEffect = HOLD_EFFECT_FAIRY_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -13640,6 +13662,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_FAIRY, .flingPower = 10, .iconPic = gItemIcon_FairyFeather, .iconPalette = gItemIconPalette_FairyFeather, diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c index 8541c21f27..ffac25e54e 100644 --- a/test/battle/ability/corrosion.c +++ b/test/battle/ability/corrosion.c @@ -73,7 +73,8 @@ SINGLE_BATTLE_TEST("Corrosion can poison Poison- and Steel-type targets if it us GIVEN { ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); - ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_POISON_POWER); + 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); diff --git a/test/battle/hold_effect/type_power.c b/test/battle/hold_effect/type_power.c new file mode 100644 index 0000000000..535183b629 --- /dev/null +++ b/test/battle/hold_effect/type_power.c @@ -0,0 +1,55 @@ +#include "global.h" +#include "test/battle.h" + +static const u16 sMoveItemTable[][18] = +{ + { TYPE_NORMAL, MOVE_SCRATCH, ITEM_SILK_SCARF }, + { TYPE_FIGHTING, MOVE_KARATE_CHOP, ITEM_BLACK_BELT }, + { TYPE_FLYING, MOVE_WING_ATTACK, ITEM_SHARP_BEAK }, + { TYPE_POISON, MOVE_POISON_STING, ITEM_POISON_BARB }, + { TYPE_GROUND, MOVE_MUD_SHOT, ITEM_SOFT_SAND }, + { TYPE_ROCK, MOVE_ROCK_THROW, ITEM_HARD_STONE }, + { TYPE_BUG, MOVE_BUG_BITE, ITEM_SILVER_POWDER }, + { TYPE_GHOST, MOVE_SHADOW_PUNCH, ITEM_SPELL_TAG }, + { TYPE_STEEL, MOVE_METAL_CLAW, ITEM_METAL_COAT }, + { TYPE_FIRE, MOVE_EMBER, ITEM_CHARCOAL }, + { TYPE_WATER, MOVE_WATER_GUN, ITEM_MYSTIC_WATER }, + { TYPE_GRASS, MOVE_VINE_WHIP, ITEM_MIRACLE_SEED }, + { TYPE_ELECTRIC, MOVE_THUNDER_SHOCK, ITEM_MAGNET }, + { TYPE_PSYCHIC, MOVE_CONFUSION, ITEM_TWISTED_SPOON }, + { TYPE_ICE, MOVE_AURORA_BEAM, ITEM_NEVER_MELT_ICE }, + { TYPE_DRAGON, MOVE_DRAGON_BREATH, ITEM_DRAGON_FANG }, + { TYPE_DARK, MOVE_BITE, ITEM_BLACK_GLASSES }, + { TYPE_FAIRY, MOVE_DISARMING_VOICE, ITEM_FAIRY_FEATHER }, +}; + +SINGLE_BATTLE_TEST("Type-enhancing items increase the base power of moves by 20%", s16 damage) +{ + u32 move = 0, item = 0, type = 0; + + for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) { + PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = ITEM_NONE; } + PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = sMoveItemTable[j][2]; } + } + + GIVEN { + ASSUME(GetMovePower(move) > 0); + if (item != ITEM_NONE) { + ASSUME(ItemId_GetHoldEffect(item) == HOLD_EFFECT_TYPE_POWER); + ASSUME(ItemId_GetSecondaryId(item) == type); + } + PLAYER(SPECIES_WOBBUFFET) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) { + if (I_TYPE_BOOST_POWER >= GEN_4) + EXPECT_MUL_EQ(results[j*2].damage, Q_4_12(1.2), results[(j*2)+1].damage); + else + EXPECT_MUL_EQ(results[j*2].damage, Q_4_12(1.1), results[(j*2)+1].damage); + } + } +}