Make data1 and learnMoveState an array to prevent UB

Fixes https://github.com/pret/pokeemerald/issues/2102
This commit is contained in:
AZero13 2026-04-09 16:18:43 -04:00
parent 962442a51e
commit ec4bc4fc3a
2 changed files with 26 additions and 26 deletions

View File

@ -16,8 +16,8 @@ struct PartyMenu
s8 slotId2;
u8 action;
u16 bagItem;
s16 data1; // used variously as a move, counter, moveSlotId, or cursorPos
s16 learnMoveState; // data2, used only as a learn move state
s16 data[2]; // First element is used variously as a move, counter, moveSlotId, or cursorPos.
// Second element is used as a learn move state
};
extern struct PartyMenu gPartyMenu;

View File

@ -1943,8 +1943,8 @@ static void SetPartyMonsAllowedInMinigame(void)
{
u8 i;
ptr = &gPartyMenu.data1;
gPartyMenu.data1 = 0;
ptr = &gPartyMenu.data[0];
gPartyMenu.data[0] = 0;
if (gSpecialVar_0x8005 == 0)
{
for (i = 0; i < gPlayerPartyCount; i++)
@ -1975,7 +1975,7 @@ static bool16 IsMonAllowedInDodrioBerryPicking(struct Pokemon *mon)
static bool8 IsMonAllowedInMinigame(u8 slot)
{
if (!((gPartyMenu.data1 >> slot) & 1))
if (!((gPartyMenu.data[0] >> slot) & 1))
return FALSE;
return TRUE;
}
@ -4619,7 +4619,7 @@ void ItemUseCB_PPRecovery(u8 taskId, TaskFunc task)
if (!(effect[4] & ITEM4_HEAL_PP_ONE))
{
gPartyMenu.data1 = 0;
gPartyMenu.data[0] = 0;
TryUsePPItem(taskId);
}
else
@ -4634,7 +4634,7 @@ void ItemUseCB_PPRecovery(u8 taskId, TaskFunc task)
static void SetSelectedMoveForPPItem(u8 taskId)
{
PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);
gPartyMenu.data1 = Menu_GetCursorPos();
gPartyMenu.data[0] = Menu_GetCursorPos();
TryUsePPItem(taskId);
}
@ -4649,7 +4649,7 @@ static void ReturnToUseOnWhichMon(u8 taskId)
static void TryUsePPItem(u8 taskId)
{
u16 move = MOVE_NONE;
s16 *moveSlot = &gPartyMenu.data1;
s16 *moveSlot = &gPartyMenu.data[0];
u16 item = gSpecialVar_ItemId;
struct PartyMenu *ptr = &gPartyMenu;
struct Pokemon *mon;
@ -4738,7 +4738,7 @@ void ItemUseCB_TMHM(u8 taskId, TaskFunc task)
PlaySE(SE_SELECT);
mon = &gPlayerParty[gPartyMenu.slotId];
move = &gPartyMenu.data1;
move = gPartyMenu.data;
item = gSpecialVar_ItemId;
GetMonNickname(mon, gStringVar1);
move[0] = ItemIdToBattleMoveId(item);
@ -4769,7 +4769,7 @@ void ItemUseCB_TMHM(u8 taskId, TaskFunc task)
static void Task_LearnedMove(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];
s16 *move = &gPartyMenu.data1;
s16 *move = &gPartyMenu.data[0];
u16 item = gSpecialVar_ItemId;
if (move[1] == 0)
@ -4799,13 +4799,13 @@ static void Task_LearnNextMoveOrClosePartyMenu(u8 taskId)
{
if (IsFanfareTaskInactive() && ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON))))
{
if (gPartyMenu.learnMoveState == 1)
if (gPartyMenu.data[1] == 1)
{
Task_TryLearningNextMove(taskId);
}
else
{
if (gPartyMenu.learnMoveState == 2) // never occurs
if (gPartyMenu.data[1] == 2) // never occurs
gSpecialVar_Result = TRUE;
Task_ClosePartyMenu(taskId);
}
@ -4849,7 +4849,7 @@ static void Task_ShowSummaryScreenToForgetMove(u8 taskId)
static void CB2_ShowSummaryScreenToForgetMove(void)
{
ShowSelectMovePokemonSummaryScreen(gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuWhileLearningMove, gPartyMenu.data1);
ShowSelectMovePokemonSummaryScreen(gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuWhileLearningMove, gPartyMenu.data[0]);
}
static void CB2_ReturnToPartyMenuWhileLearningMove(void)
@ -4888,7 +4888,7 @@ static void Task_PartyMenuReplaceMove(u8 taskId)
{
mon = &gPlayerParty[gPartyMenu.slotId];
RemoveMonPPBonus(mon, GetMoveSlotToReplace());
move = gPartyMenu.data1;
move = gPartyMenu.data[0];
SetMonMoveSlot(mon, move, GetMoveSlotToReplace());
Task_LearnedMove(taskId);
}
@ -4896,7 +4896,7 @@ static void Task_PartyMenuReplaceMove(u8 taskId)
static void StopLearningMovePrompt(u8 taskId)
{
StringCopy(gStringVar2, gMoveNames[gPartyMenu.data1]);
StringCopy(gStringVar2, gMoveNames[gPartyMenu.data[0]]);
StringExpandPlaceholders(gStringVar4, gText_StopLearningMove2);
DisplayPartyMenuMessage(gStringVar4, TRUE);
ScheduleBgCopyTilemapToVram(2);
@ -4920,16 +4920,16 @@ static void Task_HandleStopLearningMoveYesNoInput(u8 taskId)
{
case 0:
GetMonNickname(mon, gStringVar1);
StringCopy(gStringVar2, gMoveNames[gPartyMenu.data1]);
StringCopy(gStringVar2, gMoveNames[gPartyMenu.data[0]]);
StringExpandPlaceholders(gStringVar4, gText_MoveNotLearned);
DisplayPartyMenuMessage(gStringVar4, TRUE);
if (gPartyMenu.learnMoveState == 1)
if (gPartyMenu.data[1] == 1)
{
gTasks[taskId].func = Task_TryLearningNextMoveAfterText;
}
else
{
if (gPartyMenu.learnMoveState == 2) // never occurs
if (gPartyMenu.data[1] == 2) // never occurs
gSpecialVar_Result = FALSE;
gTasks[taskId].func = Task_ClosePartyMenuAfterText;
}
@ -4939,7 +4939,7 @@ static void Task_HandleStopLearningMoveYesNoInput(u8 taskId)
// fallthrough
case 1:
GetMonNickname(mon, gStringVar1);
StringCopy(gStringVar2, gMoveNames[gPartyMenu.data1]);
StringCopy(gStringVar2, gMoveNames[gPartyMenu.data[0]]);
DisplayLearnMoveMessage(gText_PkmnNeedsToReplaceMove);
gTasks[taskId].func = Task_ReplaceMoveYesNo;
break;
@ -5053,7 +5053,7 @@ static void Task_TryLearnNewMoves(u8 taskId)
{
RemoveLevelUpStatsWindow();
learnMove = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], TRUE);
gPartyMenu.learnMoveState = 1;
gPartyMenu.data[1] = 1;
switch (learnMove)
{
case 0: // No moves to learn
@ -5117,7 +5117,7 @@ static void DisplayMonNeedsToReplaceMove(u8 taskId)
StringExpandPlaceholders(gStringVar4, gText_PkmnNeedsToReplaceMove);
DisplayPartyMenuMessage(gStringVar4, TRUE);
ScheduleBgCopyTilemapToVram(2);
gPartyMenu.data1 = gMoveToLearn;
gPartyMenu.data[0] = gMoveToLearn;
gTasks[taskId].func = Task_ReplaceMoveYesNo;
}
@ -5128,7 +5128,7 @@ static void DisplayMonLearnedMove(u8 taskId, u16 move)
StringExpandPlaceholders(gStringVar4, gText_PkmnLearnedMove3);
DisplayPartyMenuMessage(gStringVar4, TRUE);
ScheduleBgCopyTilemapToVram(2);
gPartyMenu.data1 = move;
gPartyMenu.data[0] = move;
gTasks[taskId].func = Task_DoLearnedMoveFanfareAfterText;
}
@ -5323,10 +5323,10 @@ static void TryTutorSelectedMon(u8 taskId)
if (!gPaletteFade.active)
{
mon = &gPlayerParty[gPartyMenu.slotId];
move = &gPartyMenu.data1;
move = &gPartyMenu.data[0];
GetMonNickname(mon, gStringVar1);
gPartyMenu.data1 = GetTutorMove(gSpecialVar_0x8005);
StringCopy(gStringVar2, gMoveNames[gPartyMenu.data1]);
gPartyMenu.data[0] = GetTutorMove(gSpecialVar_0x8005);
StringCopy(gStringVar2, gMoveNames[gPartyMenu.data[0]]);
move[1] = 2;
switch (CanMonLearnTMTutor(mon, 0, gSpecialVar_0x8005))
{
@ -5337,7 +5337,7 @@ static void TryTutorSelectedMon(u8 taskId)
DisplayLearnMoveMessageAndClose(taskId, gText_PkmnAlreadyKnows);
return;
default:
if (GiveMoveToMon(mon, gPartyMenu.data1) != MON_HAS_MAX_MOVES)
if (GiveMoveToMon(mon, gPartyMenu.data[0]) != MON_HAS_MAX_MOVES)
{
Task_LearnedMove(taskId);
return;