Implement using party menu items from field (#7481)

This commit is contained in:
RavePossum 2025-08-07 15:21:33 -04:00 committed by GitHub
parent 729abca058
commit bf68865e0d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 50 additions and 61 deletions

View File

@ -16,10 +16,12 @@ struct PartyMenu
s8 slotId2;
u8 action;
u16 bagItem;
s16 data1; // used variously as a move, counter, moveSlotId, or cursorPos
s16 data1; // used variously as a move, counter, moveSlotId, cursorPos, or indicator that the menu is opened from the field
s16 learnMoveState; // data2, used only as a learn move state
};
#define DATA1_PARTY_MENU_FROM_FIELD -1
extern struct PartyMenu gPartyMenu;
extern bool8 gPartyMenuUseExitCallback;
extern u8 gSelectedMonPartyId;

View File

@ -50,6 +50,7 @@
static void SetUpItemUseCallback(u8);
static void FieldCB_UseItemOnField(void);
static void Task_CallItemUseOnFieldCallback(u8);
static void Task_PartyMenuItemUseFromField(u8);
static void Task_UseItemfinder(u8);
static void Task_CloseItemfinderMessage(u8);
static void Task_HiddenItemNearby(u8);
@ -128,15 +129,25 @@ static void SetUpItemUseCallback(u8 taskId)
type = gTasks[taskId].tEnigmaBerryType - 1;
else
type = GetItemType(gSpecialVar_ItemId) - 1;
if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE)
if (gTasks[taskId].tUsingRegisteredKeyItem && type == (ITEM_USE_PARTY_MENU - 1))
{
gBagMenu->newScreenCallback = sItemUseCallbacks[type];
Task_FadeAndCloseBagMenu(taskId);
FadeScreen(FADE_TO_BLACK, 0);
gPartyMenu.data1 = DATA1_PARTY_MENU_FROM_FIELD;
gTasks[taskId].func = Task_PartyMenuItemUseFromField;
}
else
{
gPyramidBagMenu->newScreenCallback = sItemUseCallbacks[type];
CloseBattlePyramidBag(taskId);
if (CurrentBattlePyramidLocation() == PYRAMID_LOCATION_NONE)
{
gBagMenu->newScreenCallback = sItemUseCallbacks[type];
Task_FadeAndCloseBagMenu(taskId);
}
else
{
gPyramidBagMenu->newScreenCallback = sItemUseCallbacks[type];
CloseBattlePyramidBag(taskId);
}
}
}
@ -165,6 +176,16 @@ static void Task_CallItemUseOnFieldCallback(u8 taskId)
sItemUseOnFieldCB(taskId);
}
static void Task_PartyMenuItemUseFromField(u8 taskId)
{
if (!gPaletteFade.active)
{
CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_ShowPartyMenuForItemUse);
DestroyTask(taskId);
}
}
static void DisplayCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField, const u8 *str)
{
StringExpandPlaceholders(gStringVar4, str);
@ -1380,77 +1401,37 @@ void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
void ItemUseOutOfBattle_FormChange(u8 taskId)
{
if (!gTasks[taskId].tUsingRegisteredKeyItem)
{
gItemUseCB = ItemUseCB_FormChange;
gTasks[taskId].data[0] = FALSE;
SetUpItemUseOnFieldCallback(taskId);
}
else
{
// TODO: handle key items with callbacks to menus allow to be used by registering them.
DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem);
}
gItemUseCB = ItemUseCB_FormChange;
gTasks[taskId].data[0] = FALSE;
SetUpItemUseCallback(taskId);
}
void ItemUseOutOfBattle_FormChange_ConsumedOnUse(u8 taskId)
{
if (!gTasks[taskId].tUsingRegisteredKeyItem)
{
gItemUseCB = ItemUseCB_FormChange_ConsumedOnUse;
gTasks[taskId].data[0] = TRUE;
SetUpItemUseOnFieldCallback(taskId);
}
else
{
// TODO: handle key items with callbacks to menus allow to be used by registering them.
DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem);
}
gItemUseCB = ItemUseCB_FormChange_ConsumedOnUse;
gTasks[taskId].data[0] = TRUE;
SetUpItemUseCallback(taskId);
}
void ItemUseOutOfBattle_RotomCatalog(u8 taskId)
{
if (!gTasks[taskId].tUsingRegisteredKeyItem)
{
gItemUseCB = ItemUseCB_RotomCatalog;
gTasks[taskId].data[0] = TRUE;
SetUpItemUseOnFieldCallback(taskId);
}
else
{
// TODO: handle key items with callbacks to menus allow to be used by registering them.
DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem);
}
gItemUseCB = ItemUseCB_RotomCatalog;
gTasks[taskId].data[0] = TRUE;
SetUpItemUseCallback(taskId);
}
void ItemUseOutOfBattle_ZygardeCube(u8 taskId)
{
if (!gTasks[taskId].tUsingRegisteredKeyItem)
{
gItemUseCB = ItemUseCB_ZygardeCube;
gTasks[taskId].data[0] = TRUE;
SetUpItemUseOnFieldCallback(taskId);
}
else
{
// TODO: handle key items with callbacks to menus allow to be used by registering them.
DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem);
}
gItemUseCB = ItemUseCB_ZygardeCube;
gTasks[taskId].data[0] = TRUE;
SetUpItemUseCallback(taskId);
}
void ItemUseOutOfBattle_Fusion(u8 taskId)
{
if (!gTasks[taskId].tUsingRegisteredKeyItem)
{
gItemUseCB = ItemUseCB_Fusion;
gTasks[taskId].data[0] = FALSE;
SetUpItemUseCallback(taskId);
}
else
{
// TODO: handle key items with callbacks to menus allow to be used by registering them.
DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem);
}
gItemUseCB = ItemUseCB_Fusion;
gTasks[taskId].data[0] = FALSE;
SetUpItemUseCallback(taskId);
}
void Task_UseHoneyOnField(u8 taskId)

View File

@ -4559,6 +4559,12 @@ void CB2_ShowPartyMenuForItemUse(void)
u8 msgId;
TaskFunc task;
if (gPartyMenu.data1 == DATA1_PARTY_MENU_FROM_FIELD)
{
callback = CB2_ReturnToField;
gPartyMenu.data1 = 0;
}
if (gMain.inBattle)
{
menuType = PARTY_MENU_TYPE_IN_BATTLE;