diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 410fd22a4..5092dc79e 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1400,12 +1400,7 @@ void Inventory_SwapAgeEquipment(void) { if (i != 0) { gSaveContext.childEquips.buttonItems[i] = gSaveContext.equips.buttonItems[i]; } else { - if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && - (gSaveContext.infTable[29] & 1)) { - gSaveContext.childEquips.buttonItems[i] = ITEM_NONE; - } else { - gSaveContext.childEquips.buttonItems[i] = ITEM_SWORD_KOKIRI; - } + gSaveContext.childEquips.buttonItems[i] = ITEM_SWORD_KOKIRI; } if (i != 0) { @@ -1473,6 +1468,13 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.infTable[29] |= 1; } + // 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 || gSaveContext.infTable[29] & 1)) { + gSaveContext.infTable[29] |= 1; + gSaveContext.childEquips.buttonItems[0] = ITEM_NONE; + } + for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { gSaveContext.adultEquips.buttonItems[i] = gSaveContext.equips.buttonItems[i]; @@ -1482,10 +1484,32 @@ void Inventory_SwapAgeEquipment(void) { } gSaveContext.adultEquips.equipment = gSaveContext.equips.equipment; + // Switching age using enhancements separated out to make vanilla flow clear + if (CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) { + for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { + gSaveContext.equips.buttonItems[i] = gSaveContext.childEquips.buttonItems[i]; - if (gSaveContext.childEquips.buttonItems[0] != ITEM_NONE || - CVarGetInteger("gSwitchAge", 0) || - CVarGetInteger("gSwitchTimeline", 0)) { + if (i != 0) { + gSaveContext.equips.cButtonSlots[i - 1] = gSaveContext.childEquips.cButtonSlots[i - 1]; + } + + if (((gSaveContext.equips.buttonItems[i] >= ITEM_BOTTLE) && + (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || + ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && + (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { + osSyncPrintf("Register_Item_Pt(%d)=%d\n", i, gSaveContext.equips.cButtonSlots[i - 1]); + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } + } + + gSaveContext.equips.equipment = gSaveContext.childEquips.equipment; + gSaveContext.equips.equipment &= 0xFFF0; + // 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) && !(gSaveContext.infTable[29] & 1)) { + gSaveContext.equips.equipment |= 0x0001; + } + } else if (gSaveContext.childEquips.buttonItems[0] != ITEM_NONE) { for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { gSaveContext.equips.buttonItems[i] = gSaveContext.childEquips.buttonItems[i];