diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index bdf042d63..669d7c0b8 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -102,7 +102,7 @@ #define HOLD_EFFECT_GRISEOUS_ORB 96 #define HOLD_EFFECT_GRACIDEA 97 #define HOLD_EFFECT_RESIST_BERRY 98 -#define HOLD_EFFECT_EV_BOOST 99 +#define HOLD_EFFECT_POWER_ITEM 99 #define HOLD_EFFECT_RESTORE_PCT_HP 100 // Gen5 hold effects diff --git a/src/battle_main.c b/src/battle_main.c index 17375b24c..3617978ef 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4242,7 +4242,7 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) } // item effects - if (GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_MACHO_BRACE || GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_EV_BOOST) + if (GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_MACHO_BRACE || GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_POWER_ITEM) speed /= 2; else if (holdEffect == HOLD_EFFECT_IRON_BALL) speed /= 2; diff --git a/src/pokemon.c b/src/pokemon.c index e38befa4a..ed890c7df 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5560,6 +5560,24 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) u16 heldItem; u8 holdEffect; int i, multiplier; + u8 stat; + u8 bonus; + + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + holdEffect = gEnigmaBerries[0].holdEffect; + else + holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + stat = ItemId_GetSecondaryId(heldItem); + bonus = ItemId_GetHoldEffectParam(heldItem); for (i = 0; i < NUM_STATS; i++) { @@ -5580,36 +5598,41 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) switch (i) { case STAT_HP: - evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier; + if (holdEffect == HOLD_EFFECT_POWER_ITEM && stat == STAT_HP) + evIncrease = (gBaseStats[defeatedSpecies].evYield_HP + bonus) * multiplier; + else + evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier; break; case STAT_ATK: - evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier; + if (holdEffect == HOLD_EFFECT_POWER_ITEM && stat == STAT_ATK) + evIncrease = (gBaseStats[defeatedSpecies].evYield_Attack + bonus) * multiplier; + else + evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier; break; case STAT_DEF: - evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier; + if (holdEffect == HOLD_EFFECT_POWER_ITEM && stat == STAT_DEF) + evIncrease = (gBaseStats[defeatedSpecies].evYield_Defense + bonus) * multiplier; + else + evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier; break; case STAT_SPEED: - evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier; + if (holdEffect == HOLD_EFFECT_POWER_ITEM && stat == STAT_SPEED) + evIncrease = (gBaseStats[defeatedSpecies].evYield_Speed + bonus) * multiplier; + else + evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier; break; case STAT_SPATK: - evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier; + if (holdEffect == HOLD_EFFECT_POWER_ITEM && stat == STAT_SPATK) + evIncrease = (gBaseStats[defeatedSpecies].evYield_SpAttack + bonus) * multiplier; + else + evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier; break; case STAT_SPDEF: - evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier; - break; - } - - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - if (heldItem == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - holdEffect = gEnigmaBerries[0].holdEffect; + if (holdEffect == HOLD_EFFECT_POWER_ITEM && stat == STAT_SPDEF) + evIncrease = (gBaseStats[defeatedSpecies].evYield_SpDefense + bonus) * multiplier; else - holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; - } - else - { - holdEffect = ItemId_GetHoldEffect(heldItem); + evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier; + break; } if (holdEffect == HOLD_EFFECT_MACHO_BRACE)