Combined type-enhancing hold effects (#6846)

This commit is contained in:
Eduardo Quezada 2025-05-14 07:45:08 -04:00 committed by GitHub
parent face37e8f3
commit 3ef61e6451
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 127 additions and 148 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;
}

View File

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

View File

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

View File

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

View File

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