Moved usedHeldItem to Party State struct (#8006)

This commit is contained in:
Alex 2025-10-24 18:56:16 +02:00 committed by GitHub
parent cec0351dd5
commit 65244cbeb4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 21 additions and 27 deletions

View File

@ -600,6 +600,7 @@ struct PartyState
u32 changedSpecies:11; // For forms when multiple mons can change into the same pokemon.
u32 sentOut:1;
u32 padding:9;
u16 usedHeldItem;
};
// Cleared at the beginning of the battle. Fields need to be cleared when needed manually otherwise.
@ -669,7 +670,6 @@ struct BattleStruct
u8 isSkyBattle:1;
u8 multipleSwitchInSortedBattlers[MAX_BATTLERS_COUNT];
void (*savedCallback)(void);
u16 usedHeldItems[PARTY_SIZE][NUM_BATTLE_SIDES]; // For each party member and side. For harvest, recycle
u16 chosenItem[MAX_BATTLERS_COUNT];
u16 choicedMove[MAX_BATTLERS_COUNT];
u16 changedItems[MAX_BATTLERS_COUNT];

View File

@ -340,7 +340,6 @@ bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes);
void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast);
bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind);
bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget);
u16 GetUsedHeldItem(u32 battler);
bool32 PickupHasValidTarget(u32 battler);
bool32 CantPickupItem(u32 battler);
bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags);

View File

@ -218,7 +218,7 @@
#define EV_ITEM_RAISE_LIMIT ((I_VITAMIN_EV_CAP >= GEN_8) ? MAX_PER_STAT_EVS : 100)
// Move category defines.
enum DamageCategory
enum __attribute__((packed)) DamageCategory
{
DAMAGE_CATEGORY_PHYSICAL,
DAMAGE_CATEGORY_SPECIAL,

View File

@ -2066,7 +2066,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(-10);
break;
case EFFECT_RECYCLE:
if (GetUsedHeldItem(battlerAtk) == 0 || gBattleMons[battlerAtk].item != 0)
if (GetBattlerPartyState(battlerAtk)->usedHeldItem == 0 || gBattleMons[battlerAtk].item != 0)
ADJUST_SCORE(-10);
break;
case EFFECT_IMPRISON:
@ -5058,13 +5058,13 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru
ADJUST_SCORE(GOOD_EFFECT);
break;
case EFFECT_RECYCLE:
if (GetUsedHeldItem(battlerAtk) != ITEM_NONE)
if (GetBattlerPartyState(battlerAtk)->usedHeldItem != ITEM_NONE)
ADJUST_SCORE(WEAK_EFFECT);
if (IsRecycleEncouragedItem(GetUsedHeldItem(battlerAtk)))
if (IsRecycleEncouragedItem(GetBattlerPartyState(battlerAtk)->usedHeldItem))
ADJUST_SCORE(WEAK_EFFECT);
if (aiData->abilities[battlerAtk] == ABILITY_RIPEN)
{
u32 item = GetUsedHeldItem(battlerAtk);
u32 item = GetBattlerPartyState(battlerAtk)->usedHeldItem;
u32 toHeal = (GetItemHoldEffectParam(item) == 10) ? 10 : gBattleMons[battlerAtk].maxHP / GetItemHoldEffectParam(item);
if (IsStatBoostingBerry(item) && aiData->hpPercents[battlerAtk] > 60)

View File

@ -3107,8 +3107,8 @@ static void BattleStartClearSetData(void)
for (i = 0; i < PARTY_SIZE; i++)
{
gBattleStruct->usedHeldItems[i][B_SIDE_PLAYER] = 0;
gBattleStruct->usedHeldItems[i][B_SIDE_OPPONENT] = 0;
gBattleStruct->partyState[B_SIDE_PLAYER][i].usedHeldItem = ITEM_NONE;
gBattleStruct->partyState[B_SIDE_OPPONENT][i].usedHeldItem = ITEM_NONE;
gBattleStruct->itemLost[B_SIDE_PLAYER][i].originalItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
gBattleStruct->itemLost[B_SIDE_OPPONENT][i].originalItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM);
gPartyCriticalHits[i] = 0;

View File

@ -6871,7 +6871,7 @@ static void Cmd_moveend(void)
u32 item = gBattleMons[gBattlerAttacker].item;
gBattleMons[gBattlerAttacker].item = ITEM_NONE;
gBattleStruct->battlerState[gBattlerAttacker].canPickupItem = TRUE;
gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerAttacker]][GetBattlerSide(gBattlerAttacker)] = item;
GetBattlerPartyState(gBattlerAttacker)->usedHeldItem = item;
CheckSetUnburden(gBattlerAttacker);
BtlController_EmitSetMonData(
gBattlerAttacker,
@ -8690,8 +8690,8 @@ static void Cmd_removeitem(void)
// Popped Air Balloon cannot be restored by any means.
// Corroded items cannot be restored either.
if (GetBattlerHoldEffect(battler) != HOLD_EFFECT_AIR_BALLOON
&& GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS)
gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = itemId; // Remember if switched out
&& GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS)
GetBattlerPartyState(battler)->usedHeldItem = itemId; // Remember if switched out
gBattleMons[battler].item = ITEM_NONE;
gBattleStruct->battlerState[battler].canPickupItem = TRUE;
@ -13300,9 +13300,9 @@ static void Cmd_tryrecycleitem(void)
u16 *usedHeldItem;
if (gCurrentMove == MOVE_NONE && GetBattlerAbility(gBattlerAttacker) == ABILITY_PICKUP)
usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)];
usedHeldItem = &GetBattlerPartyState(gBattlerTarget)->usedHeldItem;
else
usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerAttacker]][GetBattlerSide(gBattlerAttacker)];
usedHeldItem = &GetBattlerPartyState(gBattlerAttacker)->usedHeldItem;
if (*usedHeldItem != ITEM_NONE && gBattleMons[gBattlerAttacker].item == ITEM_NONE)
{
gLastUsedItem = *usedHeldItem;
@ -16240,7 +16240,7 @@ void BS_HealOneSixth(void)
void BS_TryRecycleBerry(void)
{
NATIVE_ARGS(const u8 *failInstr);
u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)];
u16 *usedHeldItem = &GetBattlerPartyState(gBattlerTarget)->usedHeldItem;
if (gBattleMons[gBattlerTarget].item == ITEM_NONE
&& gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item
&& GetItemPocket(*usedHeldItem) == POCKET_BERRIES)

View File

@ -4544,7 +4544,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab
&& PickupHasValidTarget(battler))
{
gBattlerTarget = RandomUniformExcept(RNG_PICKUP, 0, gBattlersCount - 1, CantPickupItem);
gLastUsedItem = GetUsedHeldItem(gBattlerTarget);
gLastUsedItem = GetBattlerPartyState(gBattlerTarget)->usedHeldItem;
BattleScriptExecute(BattleScript_PickupActivates);
effect++;
}
@ -4553,9 +4553,9 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab
if ((IsBattlerWeatherAffected(battler, B_WEATHER_SUN) || RandomPercentage(RNG_HARVEST, 50))
&& gBattleMons[battler].item == ITEM_NONE
&& gBattleStruct->changedItems[battler] == ITEM_NONE // Will not inherit an item
&& GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES)
&& GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) == POCKET_BERRIES)
{
gLastUsedItem = GetUsedHeldItem(battler);
gLastUsedItem = GetBattlerPartyState(battler)->usedHeldItem;
BattleScriptExecute(BattleScript_HarvestActivates);
effect++;
}
@ -4748,12 +4748,12 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab
{
gBattleScripting.battler = battler;
gDisableStructs[battler].cudChew = FALSE;
gLastUsedItem = gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)];
gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = ITEM_NONE;
gLastUsedItem = GetBattlerPartyState(battler)->usedHeldItem;
GetBattlerPartyState(battler)->usedHeldItem = ITEM_NONE;
BattleScriptExecute(BattleScript_CudChewActivates);
effect++;
}
else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES)
else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) == POCKET_BERRIES)
{
gDisableStructs[battler].cudChew = TRUE;
}
@ -9700,17 +9700,12 @@ bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 ch
return TRUE;
}
u16 GetUsedHeldItem(u32 battler)
{
return gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)];
}
bool32 CantPickupItem(u32 battler)
{
// Used by RandomUniformExcept() for RNG_PICKUP
if (battler == gBattlerAttacker && (GetGenConfig(GEN_PICKUP_WILD) < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK)))
return TRUE;
return !(IsBattlerAlive(battler) && GetUsedHeldItem(battler) && gBattleStruct->battlerState[battler].canPickupItem);
return !(IsBattlerAlive(battler) && GetBattlerPartyState(battler)->usedHeldItem && gBattleStruct->battlerState[battler].canPickupItem);
}
bool32 PickupHasValidTarget(u32 battler)