From d1dac2a2ee1952d638c733ed4e7e1f0f2153ed11 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Fri, 2 Sep 2022 15:22:09 -0500 Subject: [PATCH] Add obtainability checks correctly --- .../randomizer/3drando/settings.cpp | 2 +- .../Enhancements/randomizer/randomizer.cpp | 146 +++++++++--------- .../Enhancements/randomizer/randomizerTypes.h | 2 +- soh/soh/OTRGlobals.cpp | 16 ++ soh/soh/OTRGlobals.h | 2 + .../overlays/actors/ovl_En_GirlA/z_en_girla.c | 28 +++- .../overlays/actors/ovl_En_Ossan/z_en_ossan.c | 2 +- 7 files changed, 114 insertions(+), 84 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index e8378bd1f..bb7ab1e6c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -156,7 +156,7 @@ namespace Settings { Option ShuffleRewards = Option::U8 ("Shuffle Dungeon Rewards",{"End of dungeons", "Any dungeon", "Overworld", "Anywhere"}, {shuffleRewardsEndOfDungeon, shuffleRewardsAnyDungeon, shuffleRewardsOverworld, shuffleRewardsAnywhere}); Option LinksPocketItem = Option::U8 ("Link's Pocket", {"Dungeon Reward", "Advancement", "Anything", "Nothing"}, {linksPocketDungeonReward, linksPocketAdvancement, linksPocketAnything, linksPocketNothing}); Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Song locations", "Dungeon rewards", "Anywhere"}, {songsSongLocations, songsDungeonRewards, songsAllLocations}); - Option Shopsanity = Option::U8 ("Shopsanity", {MultiVecOpts({{"Off"}, NumOpts(0, 4), {"Random"}})}, {shopsOff, shopsZero, shopsOne, shopsTwo, shopsThree, shopsFour, shopsRandom}); + Option Shopsanity = Option::U8 ("Shopsanity", {"Off","0 Items","1 Item","2 Items","3 Items","4 Items","Random"}, {shopsOff, shopsZero, shopsOne, shopsTwo, shopsThree, shopsFour, shopsRandom}); Option Tokensanity = Option::U8 ("Tokensanity", {"Off", "Dungeons", "Overworld", "All Tokens"}, {tokensOff, tokensDungeon, tokensOverworld, tokensAllTokens}); Option Scrubsanity = Option::U8 ("Scrub Shuffle", {"Off", "Affordable", "Expensive", "Random Prices"}, {scrubsOff, scrubsAffordable, scrubsExpensive, scrubsRandomPrices}); Option ShuffleCows = Option::Bool("Shuffle Cows", {"Off", "On"}, {shuffleCowsDesc}); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4749990a5..0959f6be1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -910,15 +910,15 @@ void Randomizer::ParseRandomizerSettingsFile(const char* spoilerFileName) { case RSK_SHOPSANITY: if(it.value() == "Off") { gSaveContext.randoSettings[index].value = 0; - } else if(it.value() == "0") { + } else if(it.value() == "0 Items") { gSaveContext.randoSettings[index].value = 1; - } else if(it.value() == "1") { + } else if(it.value() == "1 Item") { gSaveContext.randoSettings[index].value = 2; - } else if(it.value() == "2") { + } else if(it.value() == "2 Items") { gSaveContext.randoSettings[index].value = 3; - } else if(it.value() == "3") { + } else if(it.value() == "3 Items") { gSaveContext.randoSettings[index].value = 4; - } else if(it.value() == "4") { + } else if(it.value() == "4 Items") { gSaveContext.randoSettings[index].value = 5; } else if(it.value() == "Random") { gSaveContext.randoSettings[index].value = 6; @@ -2510,7 +2510,7 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { struct ShopItemIdentity shopItemIdentity; shopItemIdentity.randomizerCheck = RC_UNKNOWN_CHECK; - shopItemIdentity.getItemId = GI_NONE; + shopItemIdentity.ogItemId = GI_NONE; shopItemIdentity.itemPrice = -1; shopItemIdentity.isShuffled = GetRandoSettingValue(RSK_SHOPSANITY) > 0; @@ -2521,42 +2521,42 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { case 0x0C: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1; shopItemIdentity.randomizerCheck = RC_KAK_BAZAAR_ITEM_1; - shopItemIdentity.getItemId = GI_SHIELD_HYLIAN; + shopItemIdentity.ogItemId = GI_SHIELD_HYLIAN; break; case 0x2F: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2; shopItemIdentity.randomizerCheck = RC_KAK_BAZAAR_ITEM_2; - shopItemIdentity.getItemId = GI_BOMBS_5; + shopItemIdentity.ogItemId = GI_BOMBS_5; break; case 0x00: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3; shopItemIdentity.randomizerCheck = RC_KAK_BAZAAR_ITEM_3; - shopItemIdentity.getItemId = GI_NUTS_5_2; + shopItemIdentity.ogItemId = GI_NUTS_5_2; break; case 0x10: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4; shopItemIdentity.randomizerCheck = RC_KAK_BAZAAR_ITEM_4; - shopItemIdentity.getItemId = GI_HEART; + shopItemIdentity.ogItemId = GI_HEART; break; case 0x2C: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5; shopItemIdentity.randomizerCheck = RC_KAK_BAZAAR_ITEM_5; - shopItemIdentity.getItemId = GI_ARROWS_SMALL; + shopItemIdentity.ogItemId = GI_ARROWS_SMALL; break; case 0x02: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6; shopItemIdentity.randomizerCheck = RC_KAK_BAZAAR_ITEM_6; - shopItemIdentity.getItemId = GI_ARROWS_LARGE; + shopItemIdentity.ogItemId = GI_ARROWS_LARGE; break; case 0x05: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7; shopItemIdentity.randomizerCheck = RC_KAK_BAZAAR_ITEM_7; - shopItemIdentity.getItemId = GI_STICKS_1; + shopItemIdentity.ogItemId = GI_STICKS_1; break; case 0x01: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8; shopItemIdentity.randomizerCheck = RC_KAK_BAZAAR_ITEM_8; - shopItemIdentity.getItemId = GI_ARROWS_MEDIUM; + shopItemIdentity.ogItemId = GI_ARROWS_MEDIUM; break; } } else { @@ -2564,42 +2564,42 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { case 0x0C: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1; shopItemIdentity.randomizerCheck = RC_MARKET_BAZAAR_ITEM_1; - shopItemIdentity.getItemId = GI_SHIELD_HYLIAN; + shopItemIdentity.ogItemId = GI_SHIELD_HYLIAN; break; case 0x2F: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2; shopItemIdentity.randomizerCheck = RC_MARKET_BAZAAR_ITEM_2; - shopItemIdentity.getItemId = GI_BOMBS_5; + shopItemIdentity.ogItemId = GI_BOMBS_5; break; case 0x00: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3; shopItemIdentity.randomizerCheck = RC_MARKET_BAZAAR_ITEM_3; - shopItemIdentity.getItemId = GI_NUTS_5_2; + shopItemIdentity.ogItemId = GI_NUTS_5_2; break; case 0x10: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4; shopItemIdentity.randomizerCheck = RC_MARKET_BAZAAR_ITEM_4; - shopItemIdentity.getItemId = GI_HEART; + shopItemIdentity.ogItemId = GI_HEART; break; case 0x2C: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5; shopItemIdentity.randomizerCheck = RC_MARKET_BAZAAR_ITEM_5; - shopItemIdentity.getItemId = GI_ARROWS_SMALL; + shopItemIdentity.ogItemId = GI_ARROWS_SMALL; break; case 0x02: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6; shopItemIdentity.randomizerCheck = RC_MARKET_BAZAAR_ITEM_6; - shopItemIdentity.getItemId = GI_ARROWS_LARGE; + shopItemIdentity.ogItemId = GI_ARROWS_LARGE; break; case 0x05: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7; shopItemIdentity.randomizerCheck = RC_MARKET_BAZAAR_ITEM_7; - shopItemIdentity.getItemId = GI_STICKS_1; + shopItemIdentity.ogItemId = GI_STICKS_1; break; case 0x01: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8; shopItemIdentity.randomizerCheck = RC_MARKET_BAZAAR_ITEM_8; - shopItemIdentity.getItemId = GI_ARROWS_MEDIUM; + shopItemIdentity.ogItemId = GI_ARROWS_MEDIUM; break; } } @@ -2609,42 +2609,42 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { case 0x0D: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1; shopItemIdentity.randomizerCheck = RC_KF_SHOP_ITEM_1; - shopItemIdentity.getItemId = GI_SHIELD_DEKU; + shopItemIdentity.ogItemId = GI_SHIELD_DEKU; break; case 0x00: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2; shopItemIdentity.randomizerCheck = RC_KF_SHOP_ITEM_2; - shopItemIdentity.getItemId = GI_NUTS_5_2; + shopItemIdentity.ogItemId = GI_NUTS_5_2; break; case 0x04: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3; shopItemIdentity.randomizerCheck = RC_KF_SHOP_ITEM_3; - shopItemIdentity.getItemId = GI_NUTS_10; + shopItemIdentity.ogItemId = GI_NUTS_10; break; case 0x05: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4; shopItemIdentity.randomizerCheck = RC_KF_SHOP_ITEM_4; - shopItemIdentity.getItemId = GI_STICKS_1; + shopItemIdentity.ogItemId = GI_STICKS_1; break; case 0x1D: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5; shopItemIdentity.randomizerCheck = RC_KF_SHOP_ITEM_5; - shopItemIdentity.getItemId = GI_SEEDS_30; + shopItemIdentity.ogItemId = GI_SEEDS_30; break; case 0x2C: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6; shopItemIdentity.randomizerCheck = RC_KF_SHOP_ITEM_6; - shopItemIdentity.getItemId = GI_ARROWS_SMALL; + shopItemIdentity.ogItemId = GI_ARROWS_SMALL; break; case 0x01: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7; shopItemIdentity.randomizerCheck = RC_KF_SHOP_ITEM_7; - shopItemIdentity.getItemId = GI_ARROWS_MEDIUM; + shopItemIdentity.ogItemId = GI_ARROWS_MEDIUM; break; case 0x10: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8; shopItemIdentity.randomizerCheck = RC_KF_SHOP_ITEM_8; - shopItemIdentity.getItemId = GI_HEART; + shopItemIdentity.ogItemId = GI_HEART; break; } break; @@ -2653,43 +2653,43 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { case 0x03: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1; shopItemIdentity.randomizerCheck = RC_GC_SHOP_ITEM_1; - shopItemIdentity.getItemId = GI_BOMBS_5; + shopItemIdentity.ogItemId = GI_BOMBS_5; break; case 0x06: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2; shopItemIdentity.randomizerCheck = RC_GC_SHOP_ITEM_2; - shopItemIdentity.getItemId = GI_BOMBS_10; + shopItemIdentity.ogItemId = GI_BOMBS_10; break; case 0x2D: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3; shopItemIdentity.randomizerCheck = RC_GC_SHOP_ITEM_3; - shopItemIdentity.getItemId = GI_BOMBS_20; + shopItemIdentity.ogItemId = GI_BOMBS_20; break; case 0x2E: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4; shopItemIdentity.randomizerCheck = RC_GC_SHOP_ITEM_4; - shopItemIdentity.getItemId = GI_BOMBS_30; + shopItemIdentity.ogItemId = GI_BOMBS_30; break; case 0x0E: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5; shopItemIdentity.randomizerCheck = RC_GC_SHOP_ITEM_5; - shopItemIdentity.getItemId = GI_TUNIC_GORON; + shopItemIdentity.ogItemId = GI_TUNIC_GORON; break; case 0x10: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6; shopItemIdentity.randomizerCheck = RC_GC_SHOP_ITEM_6; - shopItemIdentity.getItemId = GI_HEART; + shopItemIdentity.ogItemId = GI_HEART; break; case 0x30: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7; shopItemIdentity.randomizerCheck = RC_GC_SHOP_ITEM_7; - shopItemIdentity.getItemId = GI_POTION_RED; + shopItemIdentity.ogItemId = GI_POTION_RED; break; // TODO: Not a huge issue because shopsanity won't use this slot, but it has the same actorParam as another // case 0x10: // shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8; // shopItemIdentity.randomizerCheck = RC_GC_SHOP_ITEM_8; - // shopItemIdentity.getItemId = GI_HEART; + // shopItemIdentity.ogItemId = GI_HEART; // break; } break; @@ -2698,42 +2698,42 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { case 0x0F: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1; shopItemIdentity.randomizerCheck = RC_ZD_SHOP_ITEM_1; - shopItemIdentity.getItemId = GI_TUNIC_ZORA; + shopItemIdentity.ogItemId = GI_TUNIC_ZORA; break; case 0x2C: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2; shopItemIdentity.randomizerCheck = RC_ZD_SHOP_ITEM_2; - shopItemIdentity.getItemId = GI_ARROWS_SMALL; + shopItemIdentity.ogItemId = GI_ARROWS_SMALL; break; case 0x10: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3; shopItemIdentity.randomizerCheck = RC_ZD_SHOP_ITEM_3; - shopItemIdentity.getItemId = GI_HEART; + shopItemIdentity.ogItemId = GI_HEART; break; case 0x01: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4; shopItemIdentity.randomizerCheck = RC_ZD_SHOP_ITEM_4; - shopItemIdentity.getItemId = GI_ARROWS_MEDIUM; + shopItemIdentity.ogItemId = GI_ARROWS_MEDIUM; break; case 0x00: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5; shopItemIdentity.randomizerCheck = RC_ZD_SHOP_ITEM_5; - shopItemIdentity.getItemId = GI_NUTS_5_2; + shopItemIdentity.ogItemId = GI_NUTS_5_2; break; case 0x02: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6; shopItemIdentity.randomizerCheck = RC_ZD_SHOP_ITEM_6; - shopItemIdentity.getItemId = GI_ARROWS_LARGE; + shopItemIdentity.ogItemId = GI_ARROWS_LARGE; break; case 0x07: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7; shopItemIdentity.randomizerCheck = RC_ZD_SHOP_ITEM_7; - shopItemIdentity.getItemId = GI_FISH; + shopItemIdentity.ogItemId = GI_FISH; break; case 0x31: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8; shopItemIdentity.randomizerCheck = RC_ZD_SHOP_ITEM_8; - shopItemIdentity.getItemId = GI_POTION_RED; + shopItemIdentity.ogItemId = GI_POTION_RED; break; } break; @@ -2742,42 +2742,42 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { case 0x09: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1; shopItemIdentity.randomizerCheck = RC_KAK_POTION_SHOP_ITEM_1; - shopItemIdentity.getItemId = GI_POTION_GREEN; + shopItemIdentity.ogItemId = GI_POTION_GREEN; break; case 0x27: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2; shopItemIdentity.randomizerCheck = RC_KAK_POTION_SHOP_ITEM_2; - shopItemIdentity.getItemId = GI_BLUE_FIRE; + shopItemIdentity.ogItemId = GI_BLUE_FIRE; break; case 0x08: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3; shopItemIdentity.randomizerCheck = RC_KAK_POTION_SHOP_ITEM_3; - shopItemIdentity.getItemId = GI_POTION_RED; + shopItemIdentity.ogItemId = GI_POTION_RED; break; case 0x2B: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4; shopItemIdentity.randomizerCheck = RC_KAK_POTION_SHOP_ITEM_4; - shopItemIdentity.getItemId = GI_FAIRY; + shopItemIdentity.ogItemId = GI_FAIRY; break; case 0x00: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5; shopItemIdentity.randomizerCheck = RC_KAK_POTION_SHOP_ITEM_5; - shopItemIdentity.getItemId = GI_NUTS_5_2; + shopItemIdentity.ogItemId = GI_NUTS_5_2; break; case 0x28: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6; shopItemIdentity.randomizerCheck = RC_KAK_POTION_SHOP_ITEM_6; - shopItemIdentity.getItemId = GI_BUGS; + shopItemIdentity.ogItemId = GI_BUGS; break; case 0x2A: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7; shopItemIdentity.randomizerCheck = RC_KAK_POTION_SHOP_ITEM_7; - shopItemIdentity.getItemId = GI_POE; + shopItemIdentity.ogItemId = GI_POE; break; case 0x07: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8; shopItemIdentity.randomizerCheck = RC_KAK_POTION_SHOP_ITEM_8; - shopItemIdentity.getItemId = GI_FISH; + shopItemIdentity.ogItemId = GI_FISH; break; } break; @@ -2786,42 +2786,42 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { case 0x09: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1; shopItemIdentity.randomizerCheck = RC_MARKET_POTION_SHOP_ITEM_1; - shopItemIdentity.getItemId = GI_POTION_GREEN; + shopItemIdentity.ogItemId = GI_POTION_GREEN; break; case 0x27: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2; shopItemIdentity.randomizerCheck = RC_MARKET_POTION_SHOP_ITEM_2; - shopItemIdentity.getItemId = GI_BLUE_FIRE; + shopItemIdentity.ogItemId = GI_BLUE_FIRE; break; case 0x08: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3; shopItemIdentity.randomizerCheck = RC_MARKET_POTION_SHOP_ITEM_3; - shopItemIdentity.getItemId = GI_POTION_RED; + shopItemIdentity.ogItemId = GI_POTION_RED; break; case 0x2B: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4; shopItemIdentity.randomizerCheck = RC_MARKET_POTION_SHOP_ITEM_4; - shopItemIdentity.getItemId = GI_FAIRY; + shopItemIdentity.ogItemId = GI_FAIRY; break; case 0x00: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5; shopItemIdentity.randomizerCheck = RC_MARKET_POTION_SHOP_ITEM_5; - shopItemIdentity.getItemId = GI_NUTS_5_2; + shopItemIdentity.ogItemId = GI_NUTS_5_2; break; case 0x28: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6; shopItemIdentity.randomizerCheck = RC_MARKET_POTION_SHOP_ITEM_6; - shopItemIdentity.getItemId = GI_BUGS; + shopItemIdentity.ogItemId = GI_BUGS; break; case 0x2A: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7; shopItemIdentity.randomizerCheck = RC_MARKET_POTION_SHOP_ITEM_7; - shopItemIdentity.getItemId = GI_POE; + shopItemIdentity.ogItemId = GI_POE; break; case 0x07: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8; shopItemIdentity.randomizerCheck = RC_MARKET_POTION_SHOP_ITEM_8; - shopItemIdentity.getItemId = GI_FISH; + shopItemIdentity.ogItemId = GI_FISH; break; } break; @@ -2830,42 +2830,42 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, s32 actorParams) { case 0x18: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1; shopItemIdentity.randomizerCheck = RC_MARKET_BOMBCHU_SHOP_ITEM_1; - shopItemIdentity.getItemId = GI_BOMBCHUS_10; + shopItemIdentity.ogItemId = GI_BOMBCHUS_10; break; case 0x1C: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2; shopItemIdentity.randomizerCheck = RC_MARKET_BOMBCHU_SHOP_ITEM_2; - shopItemIdentity.getItemId = GI_BOMBCHUS_10; + shopItemIdentity.ogItemId = GI_BOMBCHUS_10; break; case 0x19: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3; shopItemIdentity.randomizerCheck = RC_MARKET_BOMBCHU_SHOP_ITEM_3; - shopItemIdentity.getItemId = GI_BOMBCHUS_10; + shopItemIdentity.ogItemId = GI_BOMBCHUS_10; break; case 0x15: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4; shopItemIdentity.randomizerCheck = RC_MARKET_BOMBCHU_SHOP_ITEM_4; - shopItemIdentity.getItemId = GI_BOMBCHUS_10; + shopItemIdentity.ogItemId = GI_BOMBCHUS_10; break; case 0x1A: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5; shopItemIdentity.randomizerCheck = RC_MARKET_BOMBCHU_SHOP_ITEM_5; - shopItemIdentity.getItemId = GI_BOMBCHUS_20; + shopItemIdentity.ogItemId = GI_BOMBCHUS_20; break; case 0x16: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6; shopItemIdentity.randomizerCheck = RC_MARKET_BOMBCHU_SHOP_ITEM_6; - shopItemIdentity.getItemId = GI_BOMBCHUS_20; + shopItemIdentity.ogItemId = GI_BOMBCHUS_20; break; case 0x1B: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7; shopItemIdentity.randomizerCheck = RC_MARKET_BOMBCHU_SHOP_ITEM_7; - shopItemIdentity.getItemId = GI_BOMBCHUS_20; + shopItemIdentity.ogItemId = GI_BOMBCHUS_20; break; case 0x17: shopItemIdentity.randomizerInf = RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8; shopItemIdentity.randomizerCheck = RC_MARKET_BOMBCHU_SHOP_ITEM_8; - shopItemIdentity.getItemId = GI_BOMBCHUS_20; + shopItemIdentity.ogItemId = GI_BOMBCHUS_20; break; } break; @@ -4003,7 +4003,7 @@ void DrawRandoEditor(bool& open) { const char* randoLinksPocket[4] = { "Dungeon Reward", "Advancement", "Anything", "Nothing" }; const char* randoShuffleSongs[3] = { "Song Locations", "Dungeon Rewards", "Anywhere" }; const char* randoShuffleTokens[4] = { "Off", "Dungeons", "Overworld", "All Tokens" }; - const char* randoShopsanity[7] = { "Off", "0", "1", "2", "3", "4", "Random" }; + const char* randoShopsanity[7] = { "Off", "0 Items", "1 Item", "2 Items", "3 Items", "4 Items", "Random" }; const char* randoTokensanity[4] = { "Off", "Dungeons", "Overworld", "All Tokens" }; const char* randoShuffleScrubs[4] = { "Off", "Affordable", "Expensive", "Random Prices" }; const char* randoShuffleCows[2] = { "Off", "On" }; @@ -4435,9 +4435,9 @@ void DrawRandoEditor(bool& open) { InsertHelpHoverText( "Off - All shop items will be the same as vanilla.\n" "\n" - "0 - Vanilla shop items will be shuffled among different shops.\n" + "0 Items - Vanilla shop items will be shuffled among different shops.\n" "\n" - "1-4 - Vanilla shop items will be shuffled among different shops, and each shop will contain 1-4 non-vanilla shop items.\n" + "1-4 Items - Vanilla shop items will be shuffled among different shops, and each shop will contain 1-4 non-vanilla shop items.\n" "\n" "Random - Vanilla shop items will be shuffled among different shops, and each shop will contain a random number of non-vanilla shop items.\n" ); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 0724b4e28..5f6c310b3 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1041,7 +1041,7 @@ typedef struct ScrubIdentity { typedef struct ShopItemIdentity { RandomizerInf randomizerInf; RandomizerCheck randomizerCheck; - GetItemID getItemId; + GetItemID ogItemId; int32_t itemPrice; bool isShuffled; } ShopItemIdentity; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 765d1561a..8f22d1392 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1674,6 +1674,22 @@ extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomi return ItemTable_RetrieveEntry(getItemModIndex, itemID); } +extern "C" GetItemEntry Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { + s16 getItemModIndex; + if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) { + getItemModIndex = MOD_NONE; + } else { + getItemModIndex = MOD_RANDOMIZER; + } + s16 itemID = OTRGlobals::Instance->gRandomizer->GetItemIdFromKnownCheck(randomizerCheck, ogId); + + return ItemTable_RetrieveEntry(getItemModIndex, itemID); +} + +extern "C" ItemObtainability Randomizer_GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck) { + return OTRGlobals::Instance->gRandomizer->GetItemObtainabilityFromRandomizerCheck(randomizerCheck); +} + extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { return gSaveContext.n64ddFlag && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP; } diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 19b52c338..2369c9f79 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -107,6 +107,8 @@ void Randomizer_LoadItemLocations(const char* spoilerFileName, bool silent); bool Randomizer_IsTrialRequired(RandomizerInf trial); GetItemEntry Randomizer_GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogId); GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); +GetItemEntry Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(RandomizerCheck randomizerCheck, GetItemID ogId); +ItemObtainability Randomizer_GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor); bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId); int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx); diff --git a/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c b/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c index 338c35da6..27099fff4 100644 --- a/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c +++ b/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c @@ -393,7 +393,7 @@ void EnGirlA_InitItem(EnGirlA* this, GlobalContext* globalCtx) { } else { ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(globalCtx->sceneNum, this->actor.params); if (shopItemIdentity.randomizerCheck != RC_UNKNOWN_CHECK) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId); if (Object_IsLoaded(&globalCtx->objectCtx, getItemEntry.objectId)) { this->objBankIndex = Object_GetIndex(&globalCtx->objectCtx, getItemEntry.objectId); @@ -740,19 +740,31 @@ s32 EnGirlA_CanBuy_Fairy(GlobalContext* globalCtx, EnGirlA* this) { s32 EnGirlA_CanBuy_Randomizer(GlobalContext* globalCtx, EnGirlA* this) { ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(globalCtx->sceneNum, this->actor.params); - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.getItemId); - // TOOD: Call some some sort of Randomizer equivalent Item_CheckObtainability method to determine if they can buy + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId); + ItemObtainability itemObtainability = Randomizer_GetItemObtainabilityFromRandomizerCheck(shopItemIdentity.randomizerCheck); - if (gSaveContext.rupees < shopItemIdentity.itemPrice) { - return CANBUY_RESULT_NEED_RUPEES; + if (itemObtainability == CANT_OBTAIN_NEED_EMPTY_BOTTLE) { + return CANBUY_RESULT_NEED_BOTTLE; + } + + if (itemObtainability == CANT_OBTAIN_NEED_UPGRADE) { + return CANBUY_RESULT_CANT_GET_NOW_5; } // TOOD: We should put a sold out sign instead of preventing them from buying again // TODO: Need to allow repeated buys for some items - if (Flags_GetRandomizerInf(shopItemIdentity.randomizerInf)) { + if ( + Flags_GetRandomizerInf(shopItemIdentity.randomizerInf) || + itemObtainability == CANT_OBTAIN_ALREADY_HAVE || + itemObtainability == CANT_OBTAIN_MISC + ) { return CANBUY_RESULT_CANT_GET_NOW; } + if (gSaveContext.rupees < shopItemIdentity.itemPrice) { + return CANBUY_RESULT_NEED_RUPEES; + } + return CANBUY_RESULT_SUCCESS_FANFARE; } @@ -886,7 +898,7 @@ void EnGirlA_ItemGive_BottledItem(GlobalContext* globalCtx, EnGirlA* this) { // This is called when EnGirlA_CanBuy_Randomizer returns CANBUY_RESULT_SUCCESS void EnGirlA_ItemGive_Randomizer(GlobalContext* globalCtx, EnGirlA* this) { ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(globalCtx->sceneNum, this->actor.params); - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId); if (getItemEntry.modIndex == MOD_NONE) { Item_Give(globalCtx, getItemEntry.itemId); @@ -1070,7 +1082,7 @@ void EnGirlA_InitializeItemAction(EnGirlA* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHOPSANITY)) { ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(globalCtx->sceneNum, this->actor.params); if (shopItemIdentity.randomizerCheck != RC_UNKNOWN_CHECK) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId); itemEntry->objID = getItemEntry.objectId; itemEntry->giDrawId = getItemEntry.gid; itemEntry->getItemId = getItemEntry.getItemId; diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index dd9a71419..741b1e8fb 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -1335,7 +1335,7 @@ void EnOssan_GiveItemWithFanfare(GlobalContext* globalCtx, EnOssan* this) { } else { ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(globalCtx->sceneNum, this->shelfSlots[this->cursorIndex]->actor.params); if (shopItemIdentity.randomizerCheck != RC_UNKNOWN_CHECK) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.getItemId); + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId); GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 120.0f, 120.0f); } else { func_8002F434(&this->actor, globalCtx, this->shelfSlots[this->cursorIndex]->getItemId, 120.0f, 120.0f);