diff --git a/soh/soh/Enhancements/Presets/PresetEntries.cpp b/soh/soh/Enhancements/Presets/PresetEntries.cpp index 3b2167a2e..e09df2862 100644 --- a/soh/soh/Enhancements/Presets/PresetEntries.cpp +++ b/soh/soh/Enhancements/Presets/PresetEntries.cpp @@ -163,7 +163,6 @@ const std::vector enhancedPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RestoreRBAValues"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), // Difficulty @@ -297,7 +296,6 @@ const std::vector randomizerPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RestoreRBAValues"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), // Difficulty diff --git a/soh/soh/Enhancements/Restorations/BottleAdventure.cpp b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp new file mode 100644 index 000000000..c581a325d --- /dev/null +++ b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp @@ -0,0 +1,452 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "variables.h" +} + +// gSaveContext.inventory.items +void HandleBAInventoryItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.items[itemOnCRight]; +} + +void HandleRBAInventoryItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.items[itemOnCRight] = itemToPutInBottle; +} + +// gSaveContext.inventory.ammo +void HandleBAInventoryAmmo() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.ammo[itemOnCRight - ITEM_FAIRY]; +} + +void HandleRBAInventoryAmmo(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.ammo[itemOnCRight - ITEM_FAIRY] = itemToPutInBottle; +} + +// gSaveContext.inventory.equipment +void HandleBAInventoryEquipment() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_MASK_GORON) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.equipment >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_MASK_ZORA) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.equipment & 0xFF; + } +} + +void HandleRBAInventoryEquipment(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_MASK_GORON) { + gSaveContext.inventory.equipment = (itemToPutInBottle << 8) | (gSaveContext.inventory.equipment & 0x00FF); + } else if (itemOnCRight == ITEM_MASK_ZORA) { + gSaveContext.inventory.equipment = itemToPutInBottle | (gSaveContext.inventory.equipment & 0xFF00); + } +} + +// gSaveContext.inventory.upgrades +void HandleBAInventoryUpgrades() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SOLD_OUT) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 24) & 0xFF; + } else if (itemOnCRight == ITEM_POCKET_EGG) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 16) & 0xFF; + } else if (itemOnCRight == ITEM_POCKET_CUCCO) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_COJIRO) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.upgrades & 0xFF; + } +} + +void HandleRBAInventoryUpgrades(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SOLD_OUT) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 24) | (gSaveContext.inventory.upgrades & 0x00FFFFFF); + } else if (itemOnCRight == ITEM_POCKET_EGG) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 16) | (gSaveContext.inventory.upgrades & 0xFF00FFFF); + } else if (itemOnCRight == ITEM_POCKET_CUCCO) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 8) | (gSaveContext.inventory.upgrades & 0xFFFF00FF); + } else if (itemOnCRight == ITEM_COJIRO) { + gSaveContext.inventory.upgrades = itemToPutInBottle | (gSaveContext.inventory.upgrades & 0xFFFFFF00); + } +} + +// gSaveContext.inventory.questItems +void HandleBAInventoryQuestItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_ODD_MUSHROOM) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 24) & 0xFF; + } else if (itemOnCRight == ITEM_ODD_POTION) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 16) & 0xFF; + } else if (itemOnCRight == ITEM_SAW) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_SWORD_BROKEN) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.questItems & 0xFF; + } +} + +void HandleRBAInventoryQuestItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_ODD_MUSHROOM) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 24) | (gSaveContext.inventory.questItems & 0x00FFFFFF); + } else if (itemOnCRight == ITEM_ODD_POTION) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 16) | (gSaveContext.inventory.questItems & 0xFF00FFFF); + } else if (itemOnCRight == ITEM_SAW) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 8) | (gSaveContext.inventory.questItems & 0xFFFF00FF); + } else if (itemOnCRight == ITEM_SWORD_BROKEN) { + gSaveContext.inventory.questItems = itemToPutInBottle | (gSaveContext.inventory.questItems & 0xFFFFFF00); + } +} + +// gSaveContext.inventory.dungeonItems +void HandleBAInventoryDungeonItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION]; +} + +void HandleRBAInventoryDungeonItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION] = itemToPutInBottle; +} + +// gSaveContext.inventory.dungeonKeys +void HandleBAInventoryDungeonKeys() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40]; +} + +void HandleRBAInventoryDungeonKeys(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40] = itemToPutInBottle; +} + +// gSaveContext.inventory.defenseHearts +void HandleBAInventoryDefenseHearts() { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.defenseHearts; +} + +void HandleRBAInventoryDefenseHearts(uint8_t itemToPutInBottle) { + gSaveContext.inventory.defenseHearts = itemToPutInBottle; +} + +// gSaveContext.inventory.gsTokens +void HandleBAInventoryGSTokens() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SONG_SERENADE) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.gsTokens >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_SONG_REQUIEM) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.gsTokens & 0xFF; + } +} + +void HandleRBAInventoryGSTokens(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SONG_SERENADE) { + gSaveContext.inventory.gsTokens = (itemToPutInBottle << 8) | (gSaveContext.inventory.gsTokens & 0x00FF); + } else if (itemOnCRight == ITEM_SONG_REQUIEM) { + gSaveContext.inventory.gsTokens = itemToPutInBottle | (gSaveContext.inventory.gsTokens & 0xFF00); + } +} + +// gSaveContext.sceneFlags +void HandleBASceneFlags() { + // The rest of the items fall into the saved scene flags. Let's calculate the scene and which field it pulls from + u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; + u32 scene = offset / sizeof(SavedSceneFlags); + switch (offset % sizeof(SavedSceneFlags)) { + case 0: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 24) & 0xFF; + break; + case 1: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 16) & 0xFF; + break; + case 2: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 8) & 0xFF; + break; + case 3: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].chest & 0xFF; + break; + case 4: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 24) & 0xFF; + break; + case 5: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 16) & 0xFF; + break; + case 6: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 8) & 0xFF; + break; + case 7: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].swch & 0xFF; + break; + case 8: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 24) & 0xFF; + break; + case 9: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 16) & 0xFF; + break; + case 10: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 8) & 0xFF; + break; + case 11: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].clear & 0xFF; + break; + case 12: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 24) & 0xFF; + break; + case 13: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 16) & 0xFF; + break; + case 14: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 8) & 0xFF; + break; + case 15: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].collect & 0xFF; + break; + case 16: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 24) & 0xFF; + break; + case 17: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 16) & 0xFF; + break; + case 18: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 8) & 0xFF; + break; + case 19: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].unk & 0xFF; + break; + case 20: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 24) & 0xFF; + break; + case 21: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 16) & 0xFF; + break; + case 22: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 8) & 0xFF; + break; + case 23: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].rooms & 0xFF; + break; + case 24: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 24) & 0xFF; + break; + case 25: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 16) & 0xFF; + break; + case 26: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 8) & 0xFF; + break; + case 27: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].floors & 0xFF; + break; + } +} + +void HandleRBASceneFlags(uint8_t itemToPutInBottle) { + // The rest of the items fall into the saved scene flags. Let's calculate the scene and which field it sets + u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; + u32 scene = offset / sizeof(SavedSceneFlags); + switch (offset % sizeof(SavedSceneFlags)) { + case 0: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].chest & 0x00FFFFFF); + break; + case 1: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].chest & 0xFF00FFFF); + break; + case 2: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].chest & 0xFFFF00FF); + break; + case 3: + gSaveContext.sceneFlags[scene].chest = itemToPutInBottle | (gSaveContext.sceneFlags[scene].chest & 0xFFFFFF00); + break; + case 4: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].swch & 0x00FFFFFF); + break; + case 5: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].swch & 0xFF00FFFF); + break; + case 6: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].swch & 0xFFFF00FF); + break; + case 7: + gSaveContext.sceneFlags[scene].swch = itemToPutInBottle | (gSaveContext.sceneFlags[scene].swch & 0xFFFFFF00); + break; + case 8: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].clear & 0x00FFFFFF); + break; + case 9: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].clear & 0xFF00FFFF); + break; + case 10: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].clear & 0xFFFF00FF); + break; + case 11: + gSaveContext.sceneFlags[scene].clear = itemToPutInBottle | (gSaveContext.sceneFlags[scene].clear & 0xFFFFFF00); + break; + case 12: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].collect & 0x00FFFFFF); + break; + case 13: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].collect & 0xFF00FFFF); + break; + case 14: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].collect & 0xFFFF00FF); + break; + case 15: + gSaveContext.sceneFlags[scene].collect = itemToPutInBottle | (gSaveContext.sceneFlags[scene].collect & 0xFFFFFF00); + break; + case 16: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].unk & 0x00FFFFFF); + break; + case 17: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].unk & 0xFF00FFFF); + break; + case 18: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].unk & 0xFFFF00FF); + break; + case 19: + gSaveContext.sceneFlags[scene].unk = itemToPutInBottle | (gSaveContext.sceneFlags[scene].unk & 0xFFFFFF00); + break; + case 20: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].rooms & 0x00FFFFFF); + break; + case 21: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].rooms & 0xFF00FFFF); + break; + case 22: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].rooms & 0xFFFF00FF); + break; + case 23: + gSaveContext.sceneFlags[scene].rooms = itemToPutInBottle | (gSaveContext.sceneFlags[scene].rooms & 0xFFFFFF00); + break; + case 24: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].floors & 0x00FFFFFF); + break; + case 25: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].floors & 0xFF00FFFF); + break; + case 26: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].floors & 0xFFFF00FF); + break; + case 27: + gSaveContext.sceneFlags[scene].floors = itemToPutInBottle | (gSaveContext.sceneFlags[scene].floors & 0xFFFFFF00); + break; + } +} + +// padding bytes +void HandleBAPaddingBytes() { + // Reading from padding bytes is not implemented + gSaveContext.equips.buttonItems[0] = 0; +} + +void HandleRBAPaddingBytes() { + // Writing to padding bytes is not implemented +} + +// Bottle Adventure +void DoBA() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight >= ITEM_STICK && itemOnCRight <= ITEM_POTION_BLUE) { + HandleBAInventoryItems(); + } else if (itemOnCRight >= ITEM_FAIRY && itemOnCRight <= ITEM_MASK_BUNNY) { + HandleBAInventoryAmmo(); + } else if (itemOnCRight == ITEM_MASK_GORON || itemOnCRight == ITEM_MASK_ZORA) { + HandleBAInventoryEquipment(); + } else if (itemOnCRight == ITEM_MASK_GERUDO || itemOnCRight == ITEM_MASK_TRUTH) { + HandleBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SOLD_OUT && itemOnCRight <= ITEM_COJIRO) { + HandleBAInventoryUpgrades(); + } else if (itemOnCRight >= ITEM_ODD_MUSHROOM && itemOnCRight <= ITEM_SWORD_BROKEN) { + HandleBAInventoryQuestItems(); + } else if (itemOnCRight >= ITEM_PRESCRIPTION && itemOnCRight <= ITEM_BULLET_BAG_30) { + HandleBAInventoryDungeonItems(); + } else if (itemOnCRight >= ITEM_BULLET_BAG_40 && itemOnCRight <= ITEM_SWORD_KNIFE) { + HandleBAInventoryDungeonKeys(); + } else if (itemOnCRight == ITEM_SONG_BOLERO) { + HandleBAInventoryDefenseHearts(); + } else if (itemOnCRight == ITEM_SONG_SERENADE || itemOnCRight == ITEM_SONG_REQUIEM) { + HandleBAInventoryGSTokens(); + } else if (itemOnCRight == ITEM_SONG_NOCTURNE || itemOnCRight == ITEM_SONG_PRELUDE) { + HandleBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SONG_LULLABY) { + HandleBASceneFlags(); + } +} + +// Reverse Bottle Adventure +void DoRBA(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight >= ITEM_STICK && itemOnCRight <= ITEM_POTION_BLUE) { + HandleRBAInventoryItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_FAIRY && itemOnCRight <= ITEM_MASK_BUNNY) { + HandleRBAInventoryAmmo(itemToPutInBottle); + } else if (itemOnCRight == ITEM_MASK_GORON || itemOnCRight == ITEM_MASK_ZORA) { + HandleRBAInventoryEquipment(itemToPutInBottle); + } else if (itemOnCRight == ITEM_MASK_GERUDO || itemOnCRight == ITEM_MASK_TRUTH) { + HandleRBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SOLD_OUT && itemOnCRight <= ITEM_COJIRO) { + HandleRBAInventoryUpgrades(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_ODD_MUSHROOM && itemOnCRight <= ITEM_SWORD_BROKEN) { + HandleRBAInventoryQuestItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_PRESCRIPTION && itemOnCRight <= ITEM_BULLET_BAG_30) { + HandleRBAInventoryDungeonItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_BULLET_BAG_40 && itemOnCRight <= ITEM_SWORD_KNIFE) { + HandleRBAInventoryDungeonKeys(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_BOLERO) { + HandleRBAInventoryDefenseHearts(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_SERENADE || itemOnCRight == ITEM_SONG_REQUIEM) { + HandleRBAInventoryGSTokens(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_NOCTURNE || itemOnCRight == ITEM_SONG_PRELUDE) { + HandleRBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SONG_LULLABY) { + HandleRBASceneFlags(itemToPutInBottle); + } +} + +void RegisterBottleAdventure() { + REGISTER_VB_SHOULD(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, { + // if we aren't dealing with the b button, early return + auto button = static_cast(va_arg(args, int32_t)); + if (button != 0) { + return; + } + + *should = false; + DoBA(); + }); + + REGISTER_VB_SHOULD(VB_UPDATE_BOTTLE_ITEM, { + // if we aren't dealing with a bottle on b, early return + auto buttonBottleIsOn = static_cast(va_arg(args, int32_t)); + if (buttonBottleIsOn != 0) { + return; + } + + *should = false; + + auto itemToPutInBottle = static_cast(va_arg(args, int32_t)); + DoRBA(itemToPutInBottle); + }); +} + +static RegisterShipInitFunc initFunc(RegisterBottleAdventure); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index b4990803f..5ce3c2ea0 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1634,6 +1634,14 @@ typedef enum { // - `*EnRu1` VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (button - promoted from `s16`) + VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, + // #### `result` // ```c // true @@ -1908,6 +1916,15 @@ typedef enum { // - `*PauseContext` VB_TRANSITION_TO_SAVE_SCREEN_ON_DEATH, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (button - promoted from `u8`) + // - `int32_t` (item - promoted from `u8`) + VB_UPDATE_BOTTLE_ITEM, + // #### `result` // ```c // INV_CONTENT(ITEM_ODD_MUSHROOM) == ITEM_EYEDROPS diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index c2f425898..fbb2a8378 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -999,9 +999,6 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("QuickBongoKill")) .Options(CheckboxOptions().Tooltip( "Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him.")); - AddWidget(path, "Original RBA Values", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RestoreRBAValues")) - .Options(CheckboxOptions().Tooltip("Restores the original outcomes when performing Reverse Bottle Adventure.")); AddWidget(path, "Early Eyeball Frog", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("EarlyEyeballFrog")) .Options(CheckboxOptions().Tooltip( diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 8c93b8a57..bf0ba6a1c 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1517,8 +1517,10 @@ void Rando_Inventory_SwapAgeEquipment(void) { (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { - gSaveContext.equips.buttonItems[i] = - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + if (GameInteractor_Should(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, true, i)) { + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } } } @@ -1674,8 +1676,10 @@ void Inventory_SwapAgeEquipment(void) { ((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]]; + if (GameInteractor_Should(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, true, i)) { + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } } } @@ -2703,13 +2707,6 @@ 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], @@ -2721,11 +2718,7 @@ void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 button) { item = ITEM_MILK_HALF; } - if (CVarGetInteger(CVAR_ENHANCEMENT("RestoreRBAValues"),0)) { - byteSwapInventory(); - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; - byteSwapInventory(); - } else { + if (GameInteractor_Should(VB_UPDATE_BOTTLE_ITEM, true, button, item)) { gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; }