mirror of
https://github.com/pret/pokeemerald.git
synced 2026-05-09 04:13:03 -05:00
Make data1 and learnMoveState an array to prevent UB
Fixes https://github.com/pret/pokeemerald/issues/2102
This commit is contained in:
parent
962442a51e
commit
ec4bc4fc3a
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user