diff --git a/soh/soh/Enhancements/randomizer/item_category_adj.cpp b/soh/soh/Enhancements/randomizer/item_category_adj.cpp index 9a2d2c3644..a6b3a53abb 100644 --- a/soh/soh/Enhancements/randomizer/item_category_adj.cpp +++ b/soh/soh/Enhancements/randomizer/item_category_adj.cpp @@ -2,6 +2,7 @@ #include "z64item.h" #include "variables.h" #include "macros.h" +#include "functions.h" GetItemCategory Randomizer_AdjustItemCategory(GetItemEntry item) { GetItemCategory category = item.getItemCategory; @@ -23,5 +24,10 @@ GetItemCategory Randomizer_AdjustItemCategory(GetItemEntry item) { } } + // Downgrade keys to junk if the player already has skeleton key + if (category == ITEM_CATEGORY_SMALL_KEY && Flags_GetRandomizerInf(RAND_INF_HAS_SKELETON_KEY)) { + category = ITEM_CATEGORY_JUNK; + } + return category; } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index bd21c2a575..c50730f5ca 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1065,6 +1065,31 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { // if it's an item that just sets a randomizerInf, set it if (Rando::StaticData::RandoGetToRandInf.find(item) != Rando::StaticData::RandoGetToRandInf.end()) { Flags_SetRandomizerInf((RandomizerInf)Rando::StaticData::RandoGetToRandInf.find(item)->second); + if (item == RG_SKELETON_KEY) { + Flags_SetRandomizerInf(RAND_INF_HAS_SKELETON_KEY); + // This isn't technically necessary, because keys will no longer be consumed, + // but for the player's sanity we display that they _have_ keys. + gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; + gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; + gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; + gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; + gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; + gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; + gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] = GERUDO_TRAINING_GROUND_SMALL_KEY_MAX; + gSaveContext.inventory.dungeonKeys[SCENE_THIEVES_HIDEOUT] = GERUDO_FORTRESS_SMALL_KEY_MAX; + gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; + } else if (item >= RG_KEATON_MASK && item <= RG_MASK_OF_TRUTH) { + if (INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_NONE) { + INV_CONTENT(ITEM_TRADE_CHILD) = (int)ITEM_MASK_KEATON + (item - RG_KEATON_MASK); + } + } else if (item == RG_CHILD_WALLET && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FULL_WALLETS)) { + Rupees_ChangeBy(99); + } else if (item == RG_GREG_RUPEE) { + Rupees_ChangeBy(1); + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_FOUND_GREG] = static_cast(GAMEPLAYSTAT_TOTAL_TIME); + } + return Return_Item_Entry(giEntry, RG_NONE); } @@ -1232,31 +1257,6 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask; return Return_Item_Entry(giEntry, RG_NONE); - } else if (item == RG_SKELETON_KEY) { - Flags_SetRandomizerInf(RAND_INF_HAS_SKELETON_KEY); - // This isn't technically necessary, because keys will no longer be consumed, - // but for the player's sanity we display that they _have_ keys. - gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; - gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; - gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; - gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; - gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; - gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; - gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] = GERUDO_TRAINING_GROUND_SMALL_KEY_MAX; - gSaveContext.inventory.dungeonKeys[SCENE_THIEVES_HIDEOUT] = GERUDO_FORTRESS_SMALL_KEY_MAX; - gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; - - return Return_Item_Entry(giEntry, RG_NONE); - } else if (item >= RG_GUARD_HOUSE_KEY && item <= RG_FISHING_HOLE_KEY) { - Flags_SetRandomizerInf( - (RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1)); - return Return_Item_Entry(giEntry, RG_NONE); - } else if (item >= RG_KEATON_MASK && item <= RG_MASK_OF_TRUTH) { - Flags_SetRandomizerInf((RandomizerInf)((int)RAND_INF_CHILD_TRADES_HAS_MASK_KEATON + (item - RG_KEATON_MASK))); - if (INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_NONE) { - INV_CONTENT(ITEM_TRADE_CHILD) = (int)ITEM_MASK_KEATON + (item - RG_KEATON_MASK); - } - return Return_Item_Entry(giEntry, RG_NONE); } switch (item) { @@ -1291,17 +1291,6 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { Rupees_ChangeBy(999); } break; - case RG_CHILD_WALLET: - Flags_SetRandomizerInf(RAND_INF_HAS_WALLET); - if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FULL_WALLETS)) { - Rupees_ChangeBy(99); - } - break; - case RG_GREG_RUPEE: - Rupees_ChangeBy(1); - Flags_SetRandomizerInf(RAND_INF_GREG_FOUND); - gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_FOUND_GREG] = static_cast(GAMEPLAYSTAT_TOTAL_TIME); - break; case RG_TRIFORCE_PIECE: gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected++; GameInteractor_SetTriforceHuntPieceGiven(true);