From cff2e372873072a04457499c3243549bbcf6045c Mon Sep 17 00:00:00 2001 From: inspectredc <78732756+inspectredc@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:25:09 +0100 Subject: Restoration: RBA Values (#2672) * Restore RBA Values Matches all rba scenarios achievable in game to their original outcomes. This only ends up affecting certain trade items. * tooltip rewrite * rba cases generalised * re-add to menu bar * better byteswap and checks for endianness * remove leftover defines --- soh/src/code/z_parameter.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'soh/src/code/z_parameter.c') diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 75c85e3e4..1ff5b35b2 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2782,6 +2782,13 @@ s32 Inventory_HasSpecificBottle(u8 bottleItem) { } } +void byteSwapInventory() { + gSaveContext.inventory.equipment = BE16SWAP(gSaveContext.inventory.equipment); + gSaveContext.inventory.upgrades = BE32SWAP(gSaveContext.inventory.upgrades); + gSaveContext.inventory.questItems = BE32SWAP(gSaveContext.inventory.questItems); + gSaveContext.inventory.gsTokens = BE16SWAP(gSaveContext.inventory.gsTokens); +} + void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 button) { osSyncPrintf("item_no=%x, c_no=%x, Pt=%x Item_Register=%x\n", item, button, gSaveContext.equips.cButtonSlots[button - 1], @@ -2793,7 +2800,14 @@ void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 button) { item = ITEM_MILK_HALF; } - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; + if (CVarGetInteger("gRestoreRBAValues",0)) { + byteSwapInventory(); + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; + byteSwapInventory(); + } else { + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; + } + gSaveContext.equips.buttonItems[button] = item; Interface_LoadItemIcon1(play, button); -- cgit v1.2.3 From 9d581f10e7b4fddbbbfbce961a11b2aa4eb78ccd Mon Sep 17 00:00:00 2001 From: inspectredc <78732756+inspectredc@users.noreply.github.com> Date: Fri, 20 Oct 2023 00:13:33 +0100 Subject: magic (#3278) --- soh/src/code/z_parameter.c | 142 ++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 71 deletions(-) (limited to 'soh/src/code/z_parameter.c') diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 1ff5b35b2..c41d1c188 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2196,14 +2196,14 @@ u8 Item_Give(PlayState* play, u8 item) { } return Return_Item(item, MOD_NONE, item); } else if (item == ITEM_MAGIC_SMALL) { - if (gSaveContext.magicState != 10) { + if (gSaveContext.magicState != MAGIC_STATE_ADD) { if (play != NULL) { Magic_Fill(play); } } if (play != NULL) { - func_80087708(play, 12, 5); + Magic_RequestChange(play, 12, MAGIC_ADD); } if (!Flags_GetInfTable(INFTABLE_198)) { @@ -2213,13 +2213,13 @@ u8 Item_Give(PlayState* play, u8 item) { return Return_Item(item, MOD_NONE, item); } else if (item == ITEM_MAGIC_LARGE) { - if (gSaveContext.magicState != 10) { + if (gSaveContext.magicState != MAGIC_STATE_ADD) { if (play != NULL) { Magic_Fill(play); } } if (play != NULL) { - func_80087708(play, 24, 5); + Magic_RequestChange(play, 24, MAGIC_ADD); } if (!Flags_GetInfTable(INFTABLE_198)) { @@ -2328,7 +2328,7 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { slot = SLOT(item); if (item == RG_MAGIC_SINGLE) { gSaveContext.isMagicAcquired = true; - gSaveContext.magicFillTarget = 0x30; + gSaveContext.magicFillTarget = MAGIC_NORMAL_METER; Magic_Fill(play); return Return_Item_Entry(giEntry, RG_NONE); } else if (item == RG_MAGIC_DOUBLE) { @@ -2336,7 +2336,7 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { gSaveContext.isMagicAcquired = true; } gSaveContext.isDoubleMagicAcquired = true; - gSaveContext.magicFillTarget = 0x60; + gSaveContext.magicFillTarget = MAGIC_DOUBLE_METER; gSaveContext.magicLevel = 0; Magic_Fill(play); return Return_Item_Entry(giEntry, RG_NONE); @@ -3140,96 +3140,96 @@ void Inventory_ChangeAmmo(s16 item, s16 ammoChange) { void Magic_Fill(PlayState* play) { if (gSaveContext.isMagicAcquired) { gSaveContext.prevMagicState = gSaveContext.magicState; - gSaveContext.magicFillTarget = (gSaveContext.isDoubleMagicAcquired + 1) * 0x30; - gSaveContext.magicState = 9; + gSaveContext.magicFillTarget = (gSaveContext.isDoubleMagicAcquired + 1) * MAGIC_NORMAL_METER; + gSaveContext.magicState = MAGIC_STATE_FILL; } } -void func_800876C8(PlayState* play) { - if ((gSaveContext.magicState != 8) && (gSaveContext.magicState != 9)) { - if (gSaveContext.magicState == 10) { +void Magic_Reset(PlayState* play) { + if ((gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY) && (gSaveContext.magicState != MAGIC_STATE_FILL)) { + if (gSaveContext.magicState == MAGIC_STATE_ADD) { gSaveContext.prevMagicState = gSaveContext.magicState; } - gSaveContext.magicState = 5; + gSaveContext.magicState = MAGIC_STATE_RESET; } } -s32 func_80087708(PlayState* play, s16 arg1, s16 arg2) { +s32 Magic_RequestChange(PlayState* play, s16 amount, s16 type) { if (!gSaveContext.isMagicAcquired) { - return 0; + return false; } - if ((arg2 != 5) && (gSaveContext.magic - arg1) < 0) { + if ((type != 5) && (gSaveContext.magic - amount) < 0) { if (gSaveContext.magicCapacity != 0) { Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } - return 0; + return false; } - switch (arg2) { - case 0: - case 2: - if ((gSaveContext.magicState == 0) || (gSaveContext.magicState == 7)) { - if (gSaveContext.magicState == 7) { + switch (type) { + case MAGIC_CONSUME_NOW: + case MAGIC_CONSUME_NOW_ALT: + if ((gSaveContext.magicState == MAGIC_STATE_IDLE) || (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) { + if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) { play->actorCtx.lensActive = false; } - gSaveContext.magicTarget = gSaveContext.magic - arg1; - gSaveContext.magicState = 1; + gSaveContext.magicTarget = gSaveContext.magic - amount; + gSaveContext.magicState = MAGIC_STATE_CONSUME_SETUP; return 1; } else { Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - return 0; + return false; } - case 1: - if ((gSaveContext.magicState == 0) || (gSaveContext.magicState == 7)) { - if (gSaveContext.magicState == 7) { + case MAGIC_CONSUME_WAIT_NO_PREVIEW: + if ((gSaveContext.magicState == MAGIC_STATE_IDLE) || (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) { + if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) { play->actorCtx.lensActive = false; } - gSaveContext.magicTarget = gSaveContext.magic - arg1; - gSaveContext.magicState = 6; - return 1; + gSaveContext.magicTarget = gSaveContext.magic - amount; + gSaveContext.magicState = MAGIC_STATE_METER_FLASH_3; + return true; } else { Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - return 0; + return false; } - case 3: - if (gSaveContext.magicState == 0) { + case MAGIC_CONSUME_LENS: + if (gSaveContext.magicState == MAGIC_STATE_IDLE) { if (gSaveContext.magic != 0) { play->interfaceCtx.unk_230 = 80; - gSaveContext.magicState = 7; - return 1; + gSaveContext.magicState = MAGIC_STATE_CONSUME_LENS; + return true; } else { - return 0; + return false; } } else { - if (gSaveContext.magicState == 7) { - return 1; + if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) { + return true; } else { - return 0; + return false; } } - case 4: - if ((gSaveContext.magicState == 0) || (gSaveContext.magicState == 7)) { - if (gSaveContext.magicState == 7) { + case MAGIC_CONSUME_WAIT_PREVIEW: + if ((gSaveContext.magicState == MAGIC_STATE_IDLE) || (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) { + if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) { play->actorCtx.lensActive = false; } - gSaveContext.magicTarget = gSaveContext.magic - arg1; - gSaveContext.magicState = 4; - return 1; + gSaveContext.magicTarget = gSaveContext.magic - amount; + gSaveContext.magicState = MAGIC_STATE_METER_FLASH_2; + return true; } else { Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - return 0; + return false; } - case 5: + case MAGIC_ADD: if (gSaveContext.magicCapacity >= gSaveContext.magic) { - gSaveContext.magicTarget = gSaveContext.magic + arg1; + gSaveContext.magicTarget = gSaveContext.magic + amount; if (gSaveContext.magicTarget >= gSaveContext.magicCapacity) { gSaveContext.magicTarget = gSaveContext.magicCapacity; } - gSaveContext.magicState = 10; - return 1; + gSaveContext.magicState = MAGIC_STATE_ADD; + return true; } break; } @@ -3278,8 +3278,8 @@ void Interface_UpdateMagicBar(PlayState* play) { s16 temp; switch (gSaveContext.magicState) { - case 8: - temp = gSaveContext.magicLevel * 0x30; + case MAGIC_STATE_STEP_CAPACITY: + temp = gSaveContext.magicLevel * MAGIC_NORMAL_METER; if (gSaveContext.magicCapacity != temp) { if (gSaveContext.magicCapacity < temp) { gSaveContext.magicCapacity += 8; @@ -3293,11 +3293,11 @@ void Interface_UpdateMagicBar(PlayState* play) { } } } else { - gSaveContext.magicState = 9; + gSaveContext.magicState = MAGIC_STATE_FILL; } break; - case 9: + case MAGIC_STATE_FILL: gSaveContext.magic += 4; if (gSaveContext.gameMode == 0 && gSaveContext.sceneSetupIndex < 4) { @@ -3314,32 +3314,32 @@ void Interface_UpdateMagicBar(PlayState* play) { } break; - case 1: + case MAGIC_STATE_CONSUME_SETUP: sMagicBorderRatio = 2; - gSaveContext.magicState = 2; + gSaveContext.magicState = MAGIC_STATE_CONSUME; break; - case 2: + case MAGIC_STATE_CONSUME: gSaveContext.magic -= 2; if (gSaveContext.magic <= 0) { gSaveContext.magic = 0; - gSaveContext.magicState = 3; + gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1; if (CVarGetInteger("gCosmetics.Consumable_MagicBorder.Changed", 0)) { sMagicBorder = CVarGetColor24("gCosmetics.Consumable_MagicBorder.Value", sMagicBorder_ori); } else { sMagicBorder = sMagicBorder_ori; } } else if (gSaveContext.magic == gSaveContext.magicTarget) { - gSaveContext.magicState = 3; + gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1; if (CVarGetInteger("gCosmetics.Consumable_MagicBorder.Changed", 0)) { sMagicBorder = CVarGetColor24("gCosmetics.Consumable_MagicBorder.Value", sMagicBorder_ori); } else { sMagicBorder = sMagicBorder_ori; } } - case 3: - case 4: - case 6: + case MAGIC_STATE_METER_FLASH_1: + case MAGIC_STATE_METER_FLASH_2: + case MAGIC_STATE_METER_FLASH_3: temp = sMagicBorderIndexes[sMagicBorderStep]; borderChangeR = ABS(sMagicBorder.r - sMagicBorderColors[temp][0]) / sMagicBorderRatio; borderChangeG = ABS(sMagicBorder.g - sMagicBorderColors[temp][1]) / sMagicBorderRatio; @@ -3376,16 +3376,16 @@ void Interface_UpdateMagicBar(PlayState* play) { } break; - case 5: + case MAGIC_STATE_RESET: if (CVarGetInteger("gCosmetics.Consumable_MagicBorder.Changed", 0)) { sMagicBorder = CVarGetColor24("gCosmetics.Consumable_MagicBorder.Value", sMagicBorder_ori); } else { sMagicBorder = sMagicBorder_ori; } - gSaveContext.magicState = 0; + gSaveContext.magicState = MAGIC_STATE_IDLE; break; - case 7: + case MAGIC_STATE_CONSUME_LENS: if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && (msgCtx->msgMode == MSGMODE_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->sceneLoadFlag == 0) && (play->transitionMode == 0) && !Play_InCsMode(play)) { @@ -3402,7 +3402,7 @@ void Interface_UpdateMagicBar(PlayState* play) { play->actorCtx.lensActive = false; Audio_PlaySoundGeneral(NA_SE_SY_GLASSMODE_OFF, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - gSaveContext.magicState = 0; + gSaveContext.magicState = MAGIC_STATE_IDLE; if (CVarGetInteger("gCosmetics.Consumable_MagicBorder.Changed", 0)) { sMagicBorder = CVarGetColor24("gCosmetics.Consumable_MagicBorder.Value", sMagicBorder_ori); } else { @@ -3454,7 +3454,7 @@ void Interface_UpdateMagicBar(PlayState* play) { } break; - case 10: + case MAGIC_STATE_ADD: gSaveContext.magic += 4; Audio_PlaySoundGeneral(NA_SE_SY_GAUGE_UP - SFX_FLAG, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (gSaveContext.magic >= gSaveContext.magicTarget) { @@ -3465,7 +3465,7 @@ void Interface_UpdateMagicBar(PlayState* play) { break; default: - gSaveContext.magicState = 0; + gSaveContext.magicState = MAGIC_STATE_IDLE; break; } } @@ -3598,7 +3598,7 @@ void Interface_DrawMagicBar(PlayState* play) { ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, PRIMITIVE); gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255); - if (gSaveContext.magicState == 4) { + if (gSaveContext.magicState == MAGIC_STATE_METER_FLASH_2) { // Yellow part of the bar indicating the amount of magic to be subtracted gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_yellow.r, magicbar_yellow.g, magicbar_yellow.b, interfaceCtx->magicAlpha); @@ -5245,7 +5245,7 @@ void Interface_Draw(PlayState* play) { Interface_DrawLineupTick(play); } - if (fullUi || gSaveContext.magicState > 0) { + if (fullUi || gSaveContext.magicState > MAGIC_STATE_IDLE) { Interface_DrawMagicBar(play); } @@ -6541,7 +6541,7 @@ void Interface_Update(PlayState* play) { ((play->csCtx.state == CS_STATE_IDLE) || !Player_InCsMode(play))) { if ((gSaveContext.isMagicAcquired != 0) && (gSaveContext.magicLevel == 0)) { gSaveContext.magicLevel = gSaveContext.isDoubleMagicAcquired + 1; - gSaveContext.magicState = 8; + gSaveContext.magicState = MAGIC_STATE_STEP_CAPACITY; osSyncPrintf(VT_FGCOL(YELLOW)); osSyncPrintf("魔法スター─────ト!!!!!!!!!\n"); // "Magic Start!!!!!!!!!" osSyncPrintf("MAGIC_MAX=%d\n", gSaveContext.magicLevel); -- cgit v1.2.3 From 2eaed8d81ea2586a8a4112f17bd3a88d3c7882db Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Sat, 21 Oct 2023 21:51:37 -0400 Subject: Rando: Master Sword Shuffle (#2981) * The mother of all commits * Removed `GI_SWORD_MASTER`; "Master Sword" Items now actually give MS * Removed dupe MS entries in item pool; updated GIMESSAGE (should stop crashing on non-Windows); re-added MS in item list * Give Adult Link a freebie with shuffle MS on; cihld -> adult no longer gives MS; ToT Master Sword now gives correct item * add master sword GI draw func based on ToT MS object * Force `MasterSword` logic var to only update upon getting MS * Dorf funny line now activates with LA and MS in inv * Apply suggestions * Updated RAND_INF; Check Tracker changes; Gave RAND_INF and ice trap logic to ToT MS check; Fixed swordless behavior for HBA/fishing * ToT MS Check now works in check tracker; Visual bug where box hovers over non-existent MS gone; Fixed RAND_INF check with ToT MS pedestal; Ganon no longer gives free MS * adult equips no longer reset in MS shuffle * Apply (most) locacc review suggestions Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com> * Reorganized swordless check for interface to fit edge cases; getting master sword no longer highlights box * Edge case for BGS but no bow * Fix implicit declaration error for GI hooks (#9) * Adjusted `CanAdultAttack/Damage`; applied logic suggestions * Fixed build errors (hopefully) * Cleanup merge * get shit working again * Tidied up remaining uses of DD flag as rando indicator * make master sword invisible and fix ms flag (#10) * Add text to sheik if go mode is obtained but barrier is still up * overhaul swordless behavior in `func_80083108` * reworked ToT MS Check to have an actual GI * suggestions * Apply suggestions * Better swordless handling with temp B (#11) * better swordless handling with temp B * prevent auto save in fishing pond * prevent auto save during bombchu bowling * enum fix --------- Co-authored-by: Adam Bird Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com> Co-authored-by: RaelCappra Co-authored-by: Adam Bird --- soh/src/code/z_parameter.c | 87 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 13 deletions(-) (limited to 'soh/src/code/z_parameter.c') diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index c41d1c188..cf3192c3d 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -811,6 +811,20 @@ void func_80082850(PlayState* play, s16 maxAlpha) { } } +// buttonStatus[0] is used to represent if the B button is disabled, but also tracks +// the last active B button item during mini-games/epona (temp B) +// Since ITEM_NONE is the same as BTN_DISABLED (255), we need a different value to help us track +// that the player was swordless before like ITEM_NONE_FE (254) +#define SWORDLESS_STATUS ITEM_NONE_FE + +// Restores swordless state when using the custom value for temp B and then clears temp B +void Interface_RandoRestoreSwordless(void) { + if (IS_RANDO && gSaveContext.buttonStatus[0] == SWORDLESS_STATUS) { + gSaveContext.equips.buttonItems[0] = ITEM_NONE; + gSaveContext.buttonStatus[0] = BTN_ENABLED; + } +} + void func_80083108(PlayState* play) { MessageContext* msgCtx = &play->msgCtx; Player* player = GET_PLAYER(play); @@ -818,13 +832,20 @@ void func_80083108(PlayState* play) { s16 i; s16 sp28 = 0; + // Check for the player being swordless in rando (no item on B and swordless flag set) + // Child is always assumed due to not finding kokiri sword yet. Adult is only checked with MS shuffle on. + u8 randoIsSwordless = IS_RANDO && (LINK_IS_CHILD || Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) && + gSaveContext.equips.buttonItems[0] == ITEM_NONE && Flags_GetInfTable(INFTABLE_SWORDLESS); + u8 randoWasSwordlessBefore = IS_RANDO && gSaveContext.buttonStatus[0] == SWORDLESS_STATUS; + u8 randoCanTrackSwordless = randoIsSwordless && !randoWasSwordlessBefore; + if ((gSaveContext.cutsceneIndex < 0xFFF0) || ((play->sceneNum == SCENE_LON_LON_RANCH) && (gSaveContext.cutsceneIndex == 0xFFF0))) { gSaveContext.unk_13E7 = 0; - if ((player->stateFlags1 & 0x00800000) || (play->shootingGalleryStatus > 1) || + if ((player->stateFlags1 & PLAYER_STATE1_ON_HORSE) || (play->shootingGalleryStatus > 1) || ((play->sceneNum == SCENE_BOMBCHU_BOWLING_ALLEY) && Flags_GetSwitch(play, 0x38))) { - if (gSaveContext.equips.buttonItems[0] != ITEM_NONE) { + if (gSaveContext.equips.buttonItems[0] != ITEM_NONE || randoCanTrackSwordless) { gSaveContext.unk_13E7 = 1; if (gSaveContext.buttonStatus[0] == BTN_DISABLED) { @@ -837,9 +858,14 @@ void func_80083108(PlayState* play) { if ((gSaveContext.equips.buttonItems[0] != ITEM_SLINGSHOT) && (gSaveContext.equips.buttonItems[0] != ITEM_BOW) && (gSaveContext.equips.buttonItems[0] != ITEM_BOMBCHU) && - (gSaveContext.equips.buttonItems[0] != ITEM_NONE)) { + (gSaveContext.equips.buttonItems[0] != ITEM_NONE || randoCanTrackSwordless)) { gSaveContext.buttonStatus[0] = gSaveContext.equips.buttonItems[0]; + // Track swordless status for restoration later + if (randoCanTrackSwordless) { + gSaveContext.buttonStatus[0] = SWORDLESS_STATUS; + } + if ((play->sceneNum == SCENE_BOMBCHU_BOWLING_ALLEY) && Flags_GetSwitch(play, 0x38)) { gSaveContext.equips.buttonItems[0] = ITEM_BOMBCHU; Interface_LoadItemIcon1(play, 0); @@ -875,11 +901,11 @@ void func_80083108(PlayState* play) { Interface_ChangeAlpha(8); } else if ((play->sceneNum == SCENE_BOMBCHU_BOWLING_ALLEY) && Flags_GetSwitch(play, 0x38)) { Interface_ChangeAlpha(8); - } else if (player->stateFlags1 & 0x00800000) { + } else if (player->stateFlags1 & PLAYER_STATE1_ON_HORSE) { Interface_ChangeAlpha(12); } } else { - if (player->stateFlags1 & 0x00800000) { + if (player->stateFlags1 & PLAYER_STATE1_ON_HORSE) { Interface_ChangeAlpha(12); } } @@ -891,6 +917,12 @@ void func_80083108(PlayState* play) { if (play->interfaceCtx.unk_260 != 0) { if (gSaveContext.equips.buttonItems[0] != ITEM_FISHING_POLE) { gSaveContext.buttonStatus[0] = gSaveContext.equips.buttonItems[0]; + + // Track swordless status for restoration later + if (randoCanTrackSwordless) { + gSaveContext.buttonStatus[0] = SWORDLESS_STATUS; + } + gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; gSaveContext.unk_13EA = 0; Interface_LoadItemIcon1(play, 0); @@ -904,6 +936,8 @@ void func_80083108(PlayState* play) { gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; gSaveContext.unk_13EA = 0; + Interface_RandoRestoreSwordless(); + if (gSaveContext.equips.buttonItems[0] != ITEM_NONE) { Interface_LoadItemIcon1(play, 0); } @@ -974,7 +1008,7 @@ void func_80083108(PlayState* play) { } Interface_ChangeAlpha(50); - } else if ((player->stateFlags1 & 0x00200000) || (player->stateFlags2 & PLAYER_STATE2_CRAWLING)) { + } else if ((player->stateFlags1 & PLAYER_STATE1_CLIMBING_LADDER) || (player->stateFlags2 & PLAYER_STATE2_CRAWLING)) { if (gSaveContext.buttonStatus[0] != BTN_DISABLED) { gSaveContext.buttonStatus[0] = BTN_DISABLED; gSaveContext.buttonStatus[1] = BTN_DISABLED; @@ -988,7 +1022,7 @@ void func_80083108(PlayState* play) { Interface_ChangeAlpha(50); } } else if ((gSaveContext.eventInf[0] & 0xF) == 1) { - if (player->stateFlags1 & 0x00800000) { + if (player->stateFlags1 & PLAYER_STATE1_ON_HORSE) { if ((gSaveContext.equips.buttonItems[0] != ITEM_NONE) && (gSaveContext.equips.buttonItems[0] != ITEM_BOW)) { if (gSaveContext.inventory.items[SLOT_BOW] == ITEM_NONE) { @@ -1009,6 +1043,8 @@ void func_80083108(PlayState* play) { (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BGS) && (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE)) { gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; + + Interface_RandoRestoreSwordless(); } else { gSaveContext.buttonStatus[0] = gSaveContext.equips.buttonItems[0]; } @@ -1048,8 +1084,12 @@ void func_80083108(PlayState* play) { (gSaveContext.equips.buttonItems[0] == ITEM_BOW) || (gSaveContext.equips.buttonItems[0] == ITEM_BOMBCHU) || (gSaveContext.equips.buttonItems[0] == ITEM_NONE)) { - if ((gSaveContext.equips.buttonItems[0] != ITEM_NONE) || (gSaveContext.infTable[29] == 0)) { + if ((gSaveContext.equips.buttonItems[0] != ITEM_NONE) || (gSaveContext.infTable[29] == 0) || + randoWasSwordlessBefore) { gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; + + Interface_RandoRestoreSwordless(); + sp28 = 1; if (gSaveContext.equips.buttonItems[0] != ITEM_NONE) { @@ -1071,8 +1111,12 @@ void func_80083108(PlayState* play) { (gSaveContext.equips.buttonItems[0] == ITEM_BOW) || (gSaveContext.equips.buttonItems[0] == ITEM_BOMBCHU) || (gSaveContext.equips.buttonItems[0] == ITEM_NONE)) { - if ((gSaveContext.equips.buttonItems[0] != ITEM_NONE) || (gSaveContext.infTable[29] == 0)) { + if ((gSaveContext.equips.buttonItems[0] != ITEM_NONE) || (gSaveContext.infTable[29] == 0) || + randoWasSwordlessBefore) { gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; + + Interface_RandoRestoreSwordless(); + sp28 = 1; if (gSaveContext.equips.buttonItems[0] != ITEM_NONE) { @@ -1412,15 +1456,20 @@ void Inventory_SwapAgeEquipment(void) { } // When becoming adult, remove swordless flag since we'll get master sword + // (Unless Master Sword is shuffled) // Only in rando to keep swordless link bugs in vanilla - if (IS_RANDO) { + if (IS_RANDO && !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { Flags_UnsetInfTable(INFTABLE_SWORDLESS); } gSaveContext.childEquips.equipment = gSaveContext.equips.equipment; - if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE) { - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE && !(IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && gSaveContext.adultEquips.equipment)) { + if (!IS_RANDO || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + } else { + gSaveContext.equips.buttonItems[0] = ITEM_NONE; + } if (gSaveContext.inventory.items[SLOT_NUT] != ITEM_NONE) { gSaveContext.equips.buttonItems[1] = ITEM_NUT; @@ -1433,7 +1482,9 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.equips.buttonItems[3] = gSaveContext.inventory.items[SLOT_OCARINA]; gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB; gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA; - gSaveContext.equips.equipment = 0x1122; + + gSaveContext.equips.equipment = (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && + gSaveContext.equips.buttonItems[0] == ITEM_NONE) ? 0x1120 :0x1122; // Set the dpad to nothing gSaveContext.equips.buttonItems[4] = ITEM_NONE; @@ -1626,11 +1677,13 @@ void func_80084BF4(PlayState* play, u16 flag) { (gSaveContext.equips.buttonItems[0] == ITEM_BOMBCHU) || (gSaveContext.equips.buttonItems[0] == ITEM_FISHING_POLE)) { gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; + Interface_RandoRestoreSwordless(); Interface_LoadItemIcon1(play, 0); } } else if (gSaveContext.equips.buttonItems[0] == ITEM_NONE) { if ((gSaveContext.equips.buttonItems[0] != ITEM_NONE) || (gSaveContext.infTable[29] == 0)) { gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; + Interface_RandoRestoreSwordless(); Interface_LoadItemIcon1(play, 0); } } @@ -2556,6 +2609,13 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { return Return_Item_Entry(giEntry, RG_NONE); } + if (item == RG_MASTER_SWORD) { + if (!CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { + gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; + } + return Return_Item_Entry(giEntry, RG_NONE); + } + temp = gSaveContext.inventory.items[slot]; osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp); INV_CONTENT(item) = item; @@ -5723,6 +5783,7 @@ void Interface_Draw(PlayState* play) { (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE)) { if (gSaveContext.buttonStatus[0] != BTN_ENABLED) { gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; + Interface_RandoRestoreSwordless(); } else { gSaveContext.equips.buttonItems[0] = ITEM_NONE; } -- cgit v1.2.3 From 5dd82f59e227da2ff2c6971a53212ebead4c9fb6 Mon Sep 17 00:00:00 2001 From: inspectredc <78732756+inspectredc@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:56:36 +0000 Subject: Player Equip Docs (#3282) * hopefully everything * update docs for MS shuffle sections --- soh/src/code/z_parameter.c | 94 ++++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 40 deletions(-) (limited to 'soh/src/code/z_parameter.c') diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index cf3192c3d..ec25d2062 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1438,7 +1438,7 @@ Gfx* Gfx_TextureI8(Gfx* displayListHead, void* texture, s16 textureWidth, s16 te void Inventory_SwapAgeEquipment(void) { s16 i; - u16 temp; + u16 shieldEquipValue; if (LINK_AGE_IN_YEARS == YEARS_CHILD) { @@ -1483,8 +1483,15 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB; gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA; - gSaveContext.equips.equipment = (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && - gSaveContext.equips.buttonItems[0] == ITEM_NONE) ? 0x1120 :0x1122; + gSaveContext.equips.equipment = (EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4)) | + (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) | + (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | + (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); + + if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && + gSaveContext.equips.buttonItems[0] == ITEM_NONE) { + gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); + } // Set the dpad to nothing gSaveContext.equips.buttonItems[4] = ITEM_NONE; @@ -1518,13 +1525,13 @@ void Inventory_SwapAgeEquipment(void) { } else { // When becoming child, set swordless flag if player doesn't have kokiri sword // Only in rando to keep swordless link bugs in vanilla - if (IS_RANDO && (1 << 0 & gSaveContext.inventory.equipment) == 0) { + if (IS_RANDO && (EQUIP_INV_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4) & gSaveContext.inventory.equipment) == 0) { Flags_SetInfTable(INFTABLE_SWORDLESS); } // When using enhancements, set swordless flag if player doesn't have kokiri sword or hasn't equipped a sword yet. // Then set the child equips button items to item none to ensure kokiri sword is not equipped - if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && ((1 << 0 & gSaveContext.inventory.equipment) == 0 || Flags_GetInfTable(INFTABLE_SWORDLESS))) { + if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && ((EQUIP_INV_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4) & gSaveContext.inventory.equipment) == 0 || Flags_GetInfTable(INFTABLE_SWORDLESS))) { Flags_SetInfTable(INFTABLE_SWORDLESS); gSaveContext.childEquips.buttonItems[0] = ITEM_NONE; } @@ -1558,10 +1565,10 @@ void Inventory_SwapAgeEquipment(void) { } gSaveContext.equips.equipment = gSaveContext.childEquips.equipment; - gSaveContext.equips.equipment &= 0xFFF0; + gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); // Equips kokiri sword in the inventory screen only if kokiri sword exists in inventory and a sword has been equipped already - if (!((1 << 0 & gSaveContext.inventory.equipment) == 0) && !Flags_GetInfTable(INFTABLE_SWORDLESS)) { - gSaveContext.equips.equipment |= 0x0001; + if (!((EQUIP_INV_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4) & gSaveContext.inventory.equipment) == 0) && !Flags_GetInfTable(INFTABLE_SWORDLESS)) { + gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4); } } else if (gSaveContext.childEquips.buttonItems[0] != ITEM_NONE) { for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { @@ -1582,15 +1589,15 @@ void Inventory_SwapAgeEquipment(void) { } gSaveContext.equips.equipment = gSaveContext.childEquips.equipment; - gSaveContext.equips.equipment &= 0xFFF0; - gSaveContext.equips.equipment |= 0x0001; + gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); + gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4); } else if (IS_RANDO && Randomizer_GetSettingValue(RSK_STARTING_AGE) == RO_AGE_ADULT) { /*If in rando and starting age is adult, childEquips is not initialized and buttonItems[0] will be ITEM_NONE. When changing age from adult -> child, reset equips to "default" (only kokiri tunic/boots equipped, no sword, no C-button items, no D-Pad items). When becoming child, set swordless flag if player doesn't have kokiri sword Only in rando to keep swordless link bugs in vanilla*/ - if (1 << 0 & gSaveContext.inventory.equipment == 0) { + if (EQUIP_INV_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4) & gSaveContext.inventory.equipment == 0) { Flags_SetInfTable(INFTABLE_SWORDLESS); } @@ -1601,7 +1608,10 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.equips.cButtonSlots[i-1] = ITEM_NONE; } } - gSaveContext.equips.equipment = 0x1111; + gSaveContext.equips.equipment = (EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4)) | + (EQUIP_VALUE_SHIELD_DEKU << (EQUIP_TYPE_SHIELD * 4)) | + (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | + (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); } if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && @@ -1609,17 +1619,18 @@ void Inventory_SwapAgeEquipment(void) { Flags_SetInfTable(INFTABLE_SWORDLESS); if (gSaveContext.childEquips.equipment == 0) { // force equip kokiri tunic and boots in scenario gSaveContext.childEquips.equipment is uninitialized - gSaveContext.equips.equipment &= 0xFFF0; - gSaveContext.equips.equipment |= 0x1100; + gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); + gSaveContext.equips.equipment |= (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | + (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); } } } CVarSetInteger("gSwitchTimeline", 0); - temp = gEquipMasks[EQUIP_SHIELD] & gSaveContext.equips.equipment; - if (temp != 0) { - temp >>= gEquipShifts[EQUIP_SHIELD]; - if (!(gBitFlags[temp + 3] & gSaveContext.inventory.equipment)) { - gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_SHIELD]; + shieldEquipValue = gEquipMasks[EQUIP_TYPE_SHIELD] & gSaveContext.equips.equipment; + if (shieldEquipValue != 0) { + shieldEquipValue >>= gEquipShifts[EQUIP_TYPE_SHIELD]; + if (!CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, shieldEquipValue - 1)) { + gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_TYPE_SHIELD]; } } } @@ -1634,10 +1645,10 @@ void Interface_InitHorsebackArchery(PlayState* play) { } void func_800849EC(PlayState* play) { - gSaveContext.inventory.equipment |= gBitFlags[2] << gEquipShifts[EQUIP_SWORD]; - gSaveContext.inventory.equipment ^= 8 << gEquipShifts[EQUIP_SWORD]; + gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON); + gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE); - if (gBitFlags[3] & gSaveContext.inventory.equipment) { + if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) { gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; } else { gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; @@ -1882,17 +1893,21 @@ u8 Item_Give(PlayState* play, u8 item) { return Return_Item(item, MOD_NONE, ITEM_NONE); } else if ((item >= ITEM_SWORD_KOKIRI) && (item <= ITEM_SWORD_BGS)) { - gSaveContext.inventory.equipment |= gBitFlags[item - ITEM_SWORD_KOKIRI] << gEquipShifts[EQUIP_SWORD]; + gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_SWORD, item - ITEM_SWORD_KOKIRI + EQUIP_INV_SWORD_KOKIRI); // Both Giant's Knife and Biggoron Sword have the same Item ID, so this part handles both of them if (item == ITEM_SWORD_BGS) { gSaveContext.swordHealth = 8; // In rando, when buying Giant's Knife, also check - // for 0xE in case we don't have Kokiri Sword - if (ALL_EQUIP_VALUE(EQUIP_SWORD) == 0xF || (IS_RANDO && ALL_EQUIP_VALUE(EQUIP_SWORD) == 0xE)) { + // without the Koriri Sword in case we don't have it + if (ALL_EQUIP_VALUE(EQUIP_TYPE_SWORD) == + ((1 << EQUIP_INV_SWORD_KOKIRI) | (1 << EQUIP_INV_SWORD_MASTER) | (1 << EQUIP_INV_SWORD_BIGGORON) | + (1 << EQUIP_INV_SWORD_BROKENGIANTKNIFE)) || + (IS_RANDO && ALL_EQUIP_VALUE(EQUIP_TYPE_SWORD) == + ((1 << EQUIP_INV_SWORD_MASTER) | (1 << EQUIP_INV_SWORD_BIGGORON) | (1 << EQUIP_INV_SWORD_BROKENGIANTKNIFE)))) { - gSaveContext.inventory.equipment ^= 8 << gEquipShifts[EQUIP_SWORD]; + gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE); if (gSaveContext.equips.buttonItems[0] == ITEM_SWORD_KNIFE) { gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; @@ -1904,8 +1919,8 @@ u8 Item_Give(PlayState* play, u8 item) { } else if (item == ITEM_SWORD_MASTER) { gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; - gSaveContext.equips.equipment &= 0xFFF0; - gSaveContext.equips.equipment |= 0x0002; + gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); + gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4); if (play != NULL) { Interface_LoadItemIcon1(play, 0); } @@ -1913,13 +1928,13 @@ u8 Item_Give(PlayState* play, u8 item) { return Return_Item(item, MOD_NONE, ITEM_NONE); } else if ((item >= ITEM_SHIELD_DEKU) && (item <= ITEM_SHIELD_MIRROR)) { - gSaveContext.inventory.equipment |= (gBitFlags[item - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_SHIELD]); + gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_SHIELD, item - ITEM_SHIELD_DEKU); return Return_Item(item, MOD_NONE, ITEM_NONE); } else if ((item >= ITEM_TUNIC_KOKIRI) && (item <= ITEM_TUNIC_ZORA)) { - gSaveContext.inventory.equipment |= (gBitFlags[item - ITEM_TUNIC_KOKIRI] << gEquipShifts[EQUIP_TUNIC]); + gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_TUNIC, item - ITEM_TUNIC_KOKIRI); return Return_Item(item, MOD_NONE, ITEM_NONE); } else if ((item >= ITEM_BOOTS_KOKIRI) && (item <= ITEM_BOOTS_HOVER)) { - gSaveContext.inventory.equipment |= (gBitFlags[item - ITEM_BOOTS_KOKIRI] << gEquipShifts[EQUIP_BOOTS]); + gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_BOOTS, item - ITEM_BOOTS_KOKIRI); return Return_Item(item, MOD_NONE, ITEM_NONE); } else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) { gSaveContext.inventory.dungeonItems[gSaveContext.mapIndex] |= gBitFlags[item - ITEM_KEY_BOSS]; @@ -2610,8 +2625,8 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { } if (item == RG_MASTER_SWORD) { - if (!CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { - gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; + if (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { + gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_TYPE_SWORD]; } return Return_Item_Entry(giEntry, RG_NONE); } @@ -2651,26 +2666,25 @@ u8 Item_CheckObtainability(u8 item) { } else if ((item >= ITEM_SWORD_KOKIRI) && (item <= ITEM_SWORD_BGS)) { if (item == ITEM_SWORD_BGS) { return ITEM_NONE; - } else if ((gBitFlags[item - ITEM_SWORD_KOKIRI] << gEquipShifts[EQUIP_SWORD]) & - gSaveContext.inventory.equipment) { + } else if (CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, item - ITEM_SWORD_KOKIRI + EQUIP_INV_SWORD_KOKIRI)) { return IS_RANDO ? ITEM_NONE : item; } else { return ITEM_NONE; } } else if ((item >= ITEM_SHIELD_DEKU) && (item <= ITEM_SHIELD_MIRROR)) { - if ((gBitFlags[item - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_SHIELD]) & gSaveContext.inventory.equipment) { + if (CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, item - ITEM_SHIELD_DEKU + EQUIP_INV_SHIELD_DEKU)) { return IS_RANDO ? ITEM_NONE : item; } else { return ITEM_NONE; } } else if ((item >= ITEM_TUNIC_KOKIRI) && (item <= ITEM_TUNIC_ZORA)) { - if ((gBitFlags[item - ITEM_TUNIC_KOKIRI] << gEquipShifts[EQUIP_TUNIC]) & gSaveContext.inventory.equipment) { + if (CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, item - ITEM_TUNIC_KOKIRI + EQUIP_INV_TUNIC_KOKIRI)) { return IS_RANDO ? ITEM_NONE : item; } else { return ITEM_NONE; } } else if ((item >= ITEM_BOOTS_KOKIRI) && (item <= ITEM_BOOTS_HOVER)) { - if ((gBitFlags[item - ITEM_BOOTS_KOKIRI] << gEquipShifts[EQUIP_BOOTS]) & gSaveContext.inventory.equipment) { + if (CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, item - ITEM_BOOTS_KOKIRI + EQUIP_INV_BOOTS_KOKIRI)) { return IS_RANDO ? ITEM_NONE : item; } else { return ITEM_NONE; @@ -6489,11 +6503,11 @@ void Interface_Update(PlayState* play) { D_80125A58 = Player_GetEnvironmentalHazard(play); if (D_80125A58 == 1) { - if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 2 || CVarGetInteger("gSuperTunic", 0) != 0) { + if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == EQUIP_VALUE_TUNIC_GORON || CVarGetInteger("gSuperTunic", 0) != 0) { D_80125A58 = 0; } } else if ((Player_GetEnvironmentalHazard(play) >= 2) && (Player_GetEnvironmentalHazard(play) < 5)) { - if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 3 || CVarGetInteger("gSuperTunic", 0) != 0) { + if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == EQUIP_VALUE_TUNIC_ZORA || CVarGetInteger("gSuperTunic", 0) != 0) { D_80125A58 = 0; } } -- cgit v1.2.3