diff options
| author | ph <patrickmheintz@gmail.com> | 2026-06-14 11:55:37 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-06-14 18:55:37 +0000 |
| commit | fc2f525052f2afa5b1dcbe949ce722cd1092008c (patch) | |
| tree | 790cf13bb2025cdf0bb4b1156d7711818e41b72b | |
| parent | 3250cc27f543c4c8971ebfdab5c58fa98be597b2 (diff) | |
fix halfmilk RBA (#6670)
| -rw-r--r-- | soh/soh/Enhancements/Restorations/BottleAdventure.cpp | 16 | ||||
| -rw-r--r-- | soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h | 10 | ||||
| -rw-r--r-- | soh/src/code/z_parameter.c | 7 |
3 files changed, 31 insertions, 2 deletions
diff --git a/soh/soh/Enhancements/Restorations/BottleAdventure.cpp b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp index 22cc74e67..ef4a8d4e8 100644 --- a/soh/soh/Enhancements/Restorations/BottleAdventure.cpp +++ b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp @@ -452,6 +452,11 @@ void DoRBA(uint8_t itemToPutInBottle) { } } +bool DoHalfMilkRBA(uint8_t item) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + return (item == ITEM_BOTTLE) && (gSaveContext.inventory.items[itemOnCRight] == ITEM_MILK_BOTTLE); +} + void RegisterBottleAdventure() { REGISTER_VB_SHOULD(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, { // if we aren't dealing with the b button, early return @@ -476,6 +481,17 @@ void RegisterBottleAdventure() { auto itemToPutInBottle = static_cast<uint8_t>(va_arg(args, int32_t)); DoRBA(itemToPutInBottle); }); + + REGISTER_VB_SHOULD(VB_EMPTY_BOTTLE_TO_HALF_MILK, { + // if we aren't dealing with a bottle on b, early return + auto buttonBottleIsOn = static_cast<uint8_t>(va_arg(args, int32_t)); + if (buttonBottleIsOn != 0) { + return; + } + + auto item = static_cast<uint8_t>(va_arg(args, int32_t)); + *should = DoHalfMilkRBA(item); + }); } 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 1b64f2b4d..c252a6259 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -622,6 +622,16 @@ typedef enum { // #### `result` // ```c + // (gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] == ITEM_MILK_BOTTLE) && + // (item == ITEM_BOTTLE) + // ``` + // #### `args` + // - `int32_t` (button - promoted from `u8`) + // - `int32_t` (item - promoted from `u8`) + VB_EMPTY_BOTTLE_TO_HALF_MILK, + + // #### `result` + // ```c // (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play) // ``` // #### `args` diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index e96929a10..c378d15f4 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2671,8 +2671,11 @@ void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 button) { gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]]); // Special case to only empty half of a Lon Lon Milk Bottle - if ((gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] == ITEM_MILK_BOTTLE) && - (item == ITEM_BOTTLE)) { + if (GameInteractor_Should( + VB_EMPTY_BOTTLE_TO_HALF_MILK, + (gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] == ITEM_MILK_BOTTLE) && + (item == ITEM_BOTTLE), + button, item)) { item = ITEM_MILK_HALF; } |
