diff --git a/include/functions.h b/include/functions.h index bc14b3440..7bb86dacb 100644 --- a/include/functions.h +++ b/include/functions.h @@ -2065,9 +2065,9 @@ void Inventory_DeleteItem(s16 arg0, s16 arg1); // void func_80114CA0(void); s32 Inventory_HasEmptyBottle(void); s32 Inventory_HasItemInBottle(u8 itemId); -// void func_80114FD0(void); +// void Inventory_UpdateBottleItem(void); // void func_80115130(void); -// void func_801152B8(void); +// void Inventory_UpdateItem(void); // void func_801153C8(void); // void Interface_LoadActionLabel(void); void Interface_SetDoAction(GlobalContext* globalCtx, u16 arg1); diff --git a/include/macros.h b/include/macros.h index 464e460d5..9333185d6 100644 --- a/include/macros.h +++ b/include/macros.h @@ -66,8 +66,24 @@ #define INV_CONTENT_VOID(item) ((void)0, gSaveContext.save.inventory.items)[SLOT(item)] #define CUR_FORM ((gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) ? 0 : gSaveContext.save.playerForm) -#define CUR_FORM_BTN_ITEM(btn) ((u8)((btn) == 0 ? gSaveContext.save.equips.buttonItems[CUR_FORM][btn] : gSaveContext.save.equips.buttonItems[0][btn])) -#define CUR_FORM_CBTN_SLOT(btn) ((u8)((btn) == 0 ? gSaveContext.save.equips.cButtonSlots[CUR_FORM][btn] : gSaveContext.save.equips.cButtonSlots[0][btn])) +#define GET_CUR_FORM_BTN_ITEM(btn) ((u8)((btn) == 0 ? gSaveContext.save.equips.buttonItems[CUR_FORM][btn] : gSaveContext.save.equips.buttonItems[0][btn])) +#define GET_CUR_FORM_BTN_SLOT(btn) ((u8)((btn) == 0 ? gSaveContext.save.equips.cButtonSlots[CUR_FORM][btn] : gSaveContext.save.equips.cButtonSlots[0][btn])) + +#define SET_CUR_FORM_BTN_ITEM(btn, item) \ + if ((btn) == 0) { \ + gSaveContext.save.equips.buttonItems[CUR_FORM][btn] = (item); \ + } else { \ + gSaveContext.save.equips.buttonItems[0][btn] = (item); \ + } + +#define SET_CUR_FORM_BTN_SLOT(btn, slot) \ + if ((btn) == 0) { \ + gSaveContext.save.equips.cButtonSlots[CUR_FORM][btn] = (slot); \ + } else { \ + gSaveContext.save.equips.cButtonSlots[0][btn] = (slot); \ + } + + #define ALL_EQUIP_VALUE(equip) ((gSaveContext.save.inventory.equipment & gEquipMasks[equip]) >> gEquipShifts[equip]) #define CUR_EQUIP_VALUE(equip) ((gSaveContext.save.equips.equipment & gEquipMasks[equip]) >> gEquipShifts[equip]) diff --git a/include/z64.h b/include/z64.h index bb78ace49..e9bc5676e 100644 --- a/include/z64.h +++ b/include/z64.h @@ -569,7 +569,7 @@ typedef struct { /* 0x258 */ s16 unk_258; /* 0x25A */ s16 unk_25A; /* 0x25C */ u16 unk_25C; - /* 0x25E */ u16 unk_25E[5]; // ItemId + /* 0x25E */ u16 cursorItem[5]; /* 0x268 */ u16 unk_268[5]; /* 0x272 */ u16 equipTargetItem; /* 0x274 */ u16 equipTargetSlot; diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 64e1c6a4f..926aa4323 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -542,12 +542,12 @@ void func_8010EB50(s32 arg0) { } } -void func_8010EBA0(s16 arg0, s16 arg1) { - gSaveContext.unk_101A[arg1] = 1; - gSaveContext.unk_1080[arg1] = arg0 * 100; - gSaveContext.unk_1050[arg1] = gSaveContext.unk_1080[arg1]; - gSaveContext.unk_1020[arg1] = osGetTime(); - gSaveContext.unk_10B0[arg1] = 0; +void func_8010EBA0(s16 timer, s16 timerId) { + gSaveContext.unk_101A[timerId] = 1; + gSaveContext.unk_1080[timerId] = timer * 100; + gSaveContext.unk_1050[timerId] = gSaveContext.unk_1080[timerId]; + gSaveContext.unk_1020[timerId] = osGetTime(); + gSaveContext.unk_10B0[timerId] = 0; D_801BF8F0 = 0; } @@ -1399,16 +1399,15 @@ void Interface_InitMinigame(GlobalContext* globalCtx) { interfaceCtx->hbaAmmo = 20; } -void Interface_LoadItemIconImpl(GlobalContext* globalCtx, u8 arg1) { +void Interface_LoadItemIconImpl(GlobalContext* globalCtx, u8 btn) { InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; - u32 new_var = arg1; - func_80178E3C(_icon_item_static_testSegmentRomStart, CUR_FORM_BTN_ITEM(new_var), - &interfaceCtx->iconItemSegment[new_var * 0x1000], 0x1000); + func_80178E3C(_icon_item_static_testSegmentRomStart, GET_CUR_FORM_BTN_ITEM(btn), + &interfaceCtx->iconItemSegment[(u32)btn * 0x1000], 0x1000); } -void Interface_LoadItemIcon(GlobalContext* globalCtx, u8 arg1) { - Interface_LoadItemIconImpl(globalCtx, arg1); +void Interface_LoadItemIcon(GlobalContext* globalCtx, u8 btn) { + Interface_LoadItemIconImpl(globalCtx, btn); } void func_80112C0C(GlobalContext* globalCtx, u16 flag) { @@ -1830,21 +1829,21 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) { for (i = 0; i < 6; i++) { if (gSaveContext.save.inventory.items[slot + i] == 0x12) { if (item == 0x20) { - func_8010EBA0(0x3C, i); + func_8010EBA0(60, i); } if ((slot + i) == gSaveContext.save.equips.cButtonSlots[0][1]) { gSaveContext.save.equips.buttonItems[0][1] = item; Interface_LoadItemIconImpl(globalCtx, 1); - gSaveContext.buttonStatus[1] = 0; + gSaveContext.buttonStatus[1] = BTN_ENABLED; } else if ((slot + i) == gSaveContext.save.equips.cButtonSlots[0][2]) { gSaveContext.save.equips.buttonItems[0][2] = item; Interface_LoadItemIconImpl(globalCtx, 2); - gSaveContext.buttonStatus[2] = 0; + gSaveContext.buttonStatus[2] = BTN_ENABLED; } else if ((slot + i) == gSaveContext.save.equips.cButtonSlots[0][3]) { gSaveContext.save.equips.buttonItems[0][3] = item; Interface_LoadItemIconImpl(globalCtx, 3); - gSaveContext.buttonStatus[3] = 0; + gSaveContext.buttonStatus[3] = BTN_ENABLED; } gSaveContext.save.inventory.items[slot] = item; @@ -1902,42 +1901,26 @@ s32 Item_CheckObtainability(u8 item) { return Item_CheckObtainabilityImpl(item); } -void Inventory_DeleteItem(s16 itemId, s16 invSlot) { - s16 i; +void Inventory_DeleteItem(s16 item, s16 invSlot) { + s16 btn; gSaveContext.save.inventory.items[invSlot] = ITEM_NONE; - for (i = 1; i < 4; i++) { - if (itemId == CUR_FORM_BTN_ITEM(i)) { - if (i == 0) { - gSaveContext.save.equips.buttonItems[CUR_FORM][i] = ITEM_NONE; - } else { - gSaveContext.save.equips.buttonItems[0][i] = ITEM_NONE; - } - if (i == 0) { - gSaveContext.save.equips.cButtonSlots[CUR_FORM][i] = SLOT_NONE; - } else { - gSaveContext.save.equips.cButtonSlots[0][i] = SLOT_NONE; - } + for (btn = 1; btn < 4; btn++) { + if (GET_CUR_FORM_BTN_ITEM(btn) == item) { + SET_CUR_FORM_BTN_ITEM(btn, ITEM_NONE); + SET_CUR_FORM_BTN_SLOT(btn, SLOT_NONE); } } } -void Inventory_UnequipItem(s16 itemId) { - s16 i; +void Inventory_UnequipItem(s16 item) { + s16 btn; - for (i = 1; i < 4; i++) { - if (itemId == CUR_FORM_BTN_ITEM(i)) { - if (i == 0) { - gSaveContext.save.equips.buttonItems[CUR_FORM][i] = ITEM_NONE; - } else { - gSaveContext.save.equips.buttonItems[0][i] = ITEM_NONE; - } - if (i == 0) { - gSaveContext.save.equips.cButtonSlots[CUR_FORM][i] = SLOT_NONE; - } else { - gSaveContext.save.equips.cButtonSlots[0][i] = SLOT_NONE; - } + for (btn = 1; btn < 4; btn++) { + if (GET_CUR_FORM_BTN_ITEM(btn) == item) { + SET_CUR_FORM_BTN_ITEM(btn, ITEM_NONE); + SET_CUR_FORM_BTN_SLOT(btn, SLOT_NONE); } } } @@ -1950,13 +1933,8 @@ s32 Inventory_ReplaceItem(GlobalContext* globalCtx, u8 oldItem, u8 newItem) { gSaveContext.save.inventory.items[i] = newItem; for (i = 1; i < 4; i++) { - if (oldItem == CUR_FORM_BTN_ITEM(i)) { - if (i == 0) { - gSaveContext.save.equips.buttonItems[CUR_FORM][i] = newItem; - } else { - gSaveContext.save.equips.buttonItems[0][i] = newItem; - } - + if (GET_CUR_FORM_BTN_ITEM(i) == oldItem) { + SET_CUR_FORM_BTN_ITEM(i, newItem); Interface_LoadItemIconImpl(globalCtx, i); break; } @@ -1969,6 +1947,7 @@ s32 Inventory_ReplaceItem(GlobalContext* globalCtx, u8 oldItem, u8 newItem) { #pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80114CA0.s") + s32 Inventory_HasEmptyBottle(void) { s32 slot; @@ -1980,46 +1959,45 @@ s32 Inventory_HasEmptyBottle(void) { return false; } -s32 Inventory_HasItemInBottle(u8 itemId) { +s32 Inventory_HasItemInBottle(u8 item) { s32 slot; for (slot = SLOT_BOTTLE_1; slot <= SLOT_BOTTLE_6; slot++) { - if (gSaveContext.save.inventory.items[slot] == itemId) { + if (gSaveContext.save.inventory.items[slot] == item) { return true; } } return false; } -void func_80114FD0(GlobalContext* globalCtx, u8 item, u8 arg2) { - gSaveContext.save.inventory.items[CUR_FORM_CBTN_SLOT(arg2)] = item; - if (arg2 == 0) { - gSaveContext.save.equips.buttonItems[CUR_FORM][arg2] = item; - } else { - gSaveContext.save.equips.buttonItems[0][arg2] = item; - } - Interface_LoadItemIconImpl(globalCtx, arg2); - globalCtx->pauseCtx.unk_25E[0] = item; - gSaveContext.buttonStatus[arg2] = 0; +void Inventory_UpdateBottleItem(GlobalContext* globalCtx, u8 item, u8 btn) { + gSaveContext.save.inventory.items[GET_CUR_FORM_BTN_SLOT(btn)] = item; + SET_CUR_FORM_BTN_ITEM(btn, item); + + Interface_LoadItemIconImpl(globalCtx, btn); + + globalCtx->pauseCtx.cursorItem[0] = item; + gSaveContext.buttonStatus[btn] = BTN_ENABLED; + if (item == ITEM_HOT_SPRING_WATER) { - func_8010EBA0(0x3C, CUR_FORM_CBTN_SLOT(arg2) - 0x12); + func_8010EBA0(60, GET_CUR_FORM_BTN_SLOT(btn) - 18); } } #pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80115130.s") -void func_801152B8(GlobalContext* globalCtx, s16 slot, s16 item) { - s16 i; +/** + * Only used to equip spring water when hot sprint water timer runs out + */ +void Inventory_UpdateItem(GlobalContext* globalCtx, s16 slot, s16 item) { + s16 btn; gSaveContext.save.inventory.items[slot] = item; - for (i = 1; i < 4; i++) { - if (slot == CUR_FORM_CBTN_SLOT(i)) { - if (i == 0) { - gSaveContext.save.equips.buttonItems[CUR_FORM][i] = item; - } else { - gSaveContext.save.equips.buttonItems[0][i] = item; - } - Interface_LoadItemIconImpl(globalCtx, i); + + for (btn = 1; btn < 4; btn++) { + if (GET_CUR_FORM_BTN_SLOT(btn) == slot) { + SET_CUR_FORM_BTN_ITEM(btn, item); + Interface_LoadItemIconImpl(globalCtx, btn); } } } @@ -3770,7 +3748,7 @@ void Interface_Update(GlobalContext* globalCtx) { func_8010EF9C(globalCtx, alpha1); - if (gSaveContext.buttonStatus[5] == 0xFF) { + if (gSaveContext.buttonStatus[5] == BTN_DISABLED) { if (interfaceCtx->startAlpha != 70) { interfaceCtx->startAlpha = 70; } diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 43d8eb4d4..a70936687 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -2121,9 +2121,9 @@ 0x80114CA0:("func_80114CA0",), 0x80114E90:("Inventory_HasEmptyBottle",), 0x80114F2C:("Inventory_HasItemInBottle",), - 0x80114FD0:("func_80114FD0",), + 0x80114FD0:("Inventory_UpdateBottleItem",), 0x80115130:("func_80115130",), - 0x801152B8:("func_801152B8",), + 0x801152B8:("Inventory_UpdateItem",), 0x801153C8:("func_801153C8",), 0x80115428:("Interface_LoadActionLabel",), 0x8011552C:("Interface_SetDoAction",), diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index 60e8afe3f..2c8d24eae 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -1635,9 +1635,9 @@ asm/non_matchings/code/z_parameter/Inventory_ReplaceItem.s,Inventory_ReplaceItem asm/non_matchings/code/z_parameter/func_80114CA0.s,func_80114CA0,0x80114CA0,0x7C asm/non_matchings/code/z_parameter/Inventory_HasEmptyBottle.s,Inventory_HasEmptyBottle,0x80114E90,0x27 asm/non_matchings/code/z_parameter/Inventory_HasItemInBottle.s,Inventory_HasItemInBottle,0x80114F2C,0x29 -asm/non_matchings/code/z_parameter/func_80114FD0.s,func_80114FD0,0x80114FD0,0x58 +asm/non_matchings/code/z_parameter/Inventory_UpdateBottleItem.s,Inventory_UpdateBottleItem,0x80114FD0,0x58 asm/non_matchings/code/z_parameter/func_80115130.s,func_80115130,0x80115130,0x62 -asm/non_matchings/code/z_parameter/func_801152B8.s,func_801152B8,0x801152B8,0x44 +asm/non_matchings/code/z_parameter/Inventory_UpdateItem.s,Inventory_UpdateItem,0x801152B8,0x44 asm/non_matchings/code/z_parameter/func_801153C8.s,func_801153C8,0x801153C8,0x18 asm/non_matchings/code/z_parameter/Interface_LoadActionLabel.s,Interface_LoadActionLabel,0x80115428,0x41 asm/non_matchings/code/z_parameter/Interface_SetDoAction.s,Interface_SetDoAction,0x8011552C,0x22