Optimized PokemonUseItemEffects function (#6878)

This commit is contained in:
Eduardo Quezada 2025-05-17 09:08:28 -04:00 committed by GitHub
parent 54806c8838
commit 4145404d22
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -3896,12 +3896,13 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
// PP Up
if (effectFlags & ITEM4_PP_UP)
{
u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
effectFlags &= ~ITEM4_PP_UP;
dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
temp1 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
dataUnsigned = (ppBonuses & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
temp1 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), ppBonuses, moveIndex);
if (dataUnsigned <= 2 && temp1 > 4)
{
dataUnsigned = GetMonData(mon, MON_DATA_PP_BONUSES, NULL) + gPPUpAddValues[moveIndex];
dataUnsigned = ppBonuses + gPPUpAddValues[moveIndex];
SetMonData(mon, MON_DATA_PP_BONUSES, &dataUnsigned);
dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - temp1;
@ -3986,9 +3987,12 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
break;
case 2: // ITEM4_HEAL_HP
{
u32 currentHP = GetMonData(mon, MON_DATA_HP, NULL);
u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL);
// Check use validity.
if ((effectFlags & (ITEM4_REVIVE >> 2) && GetMonData(mon, MON_DATA_HP, NULL) != 0)
|| (!(effectFlags & (ITEM4_REVIVE >> 2)) && GetMonData(mon, MON_DATA_HP, NULL) == 0))
if ((effectFlags & (ITEM4_REVIVE >> 2) && currentHP != 0)
|| (!(effectFlags & (ITEM4_REVIVE >> 2)) && currentHP == 0))
{
itemEffectParam++;
break;
@ -3999,10 +4003,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
switch (dataUnsigned)
{
case ITEM6_HEAL_HP_FULL:
dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) - GetMonData(mon, MON_DATA_HP, NULL);
dataUnsigned = maxHP - currentHP;
break;
case ITEM6_HEAL_HP_HALF:
dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 2;
dataUnsigned = maxHP / 2;
if (dataUnsigned == 0)
dataUnsigned = 1;
break;
@ -4010,39 +4014,40 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
dataUnsigned = gBattleScripting.levelUpHP;
break;
case ITEM6_HEAL_HP_QUARTER:
dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 4;
dataUnsigned = maxHP / 4;
if (dataUnsigned == 0)
dataUnsigned = 1;
break;
}
// Only restore HP if not at max health
if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL))
if (maxHP != currentHP)
{
// Restore HP
dataUnsigned = GetMonData(mon, MON_DATA_HP, NULL) + dataUnsigned;
if (dataUnsigned > GetMonData(mon, MON_DATA_MAX_HP, NULL))
dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL);
dataUnsigned = currentHP + dataUnsigned;
if (dataUnsigned > maxHP)
dataUnsigned = maxHP;
SetMonData(mon, MON_DATA_HP, &dataUnsigned);
retVal = FALSE;
}
effectFlags &= ~(ITEM4_REVIVE >> 2);
break;
}
case 3: // ITEM4_HEAL_PP
if (!(effectFlags & (ITEM4_HEAL_PP_ONE >> 3)))
{
// Heal PP for all moves
for (temp2 = 0; (signed)(temp2) < (signed)(MAX_MON_MOVES); temp2++)
{
u16 move;
u32 move, ppBonus;
dataUnsigned = GetMonData(mon, MON_DATA_PP1 + temp2, NULL);
move = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL);
if (dataUnsigned != CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2))
ppBonus = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2);
if (dataUnsigned != ppBonus)
{
dataUnsigned += itemEffect[itemEffectParam];
if (dataUnsigned > CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2))
dataUnsigned = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2);
if (dataUnsigned > ppBonus)
dataUnsigned = ppBonus;
SetMonData(mon, MON_DATA_PP1 + temp2, &dataUnsigned);
retVal = FALSE;
}
@ -4055,11 +4060,12 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
u16 move;
dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL);
move = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);
if (dataUnsigned != CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex))
u32 ppBonus = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (dataUnsigned != ppBonus)
{
dataUnsigned += itemEffect[itemEffectParam++];
if (dataUnsigned > CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex))
dataUnsigned = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (dataUnsigned > ppBonus)
dataUnsigned = ppBonus;
SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned);
retVal = FALSE;
}
@ -4169,13 +4175,15 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
break;
case 4: // ITEM5_PP_MAX
dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
temp2 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
{
u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
dataUnsigned = (ppBonuses & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
temp2 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), ppBonuses, moveIndex);
// Check if 3 PP Ups have been applied already, and that the move has a total PP of at least 5 (excludes Sketch)
if (dataUnsigned < 3 && temp2 >= 5)
{
dataUnsigned = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
dataUnsigned = ppBonuses;
dataUnsigned &= gPPUpClearMask[moveIndex];
dataUnsigned += gPPUpAddValues[moveIndex] * 3; // Apply 3 PP Ups (max)
@ -4186,7 +4194,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
retVal = FALSE;
}
break;
}
case 5: // ITEM5_FRIENDSHIP_LOW
// Changes to friendship are given differently depending on
// how much friendship the Pokémon already has.