diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index fb5ba7ceab..b941dd5270 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1958,6 +1958,7 @@ std::map StaticData::RandoGetToRandInf = { { RG_SPEAK_KOKIRI, RAND_INF_CAN_SPEAK_KOKIRI }, { RG_SPEAK_ZORA, RAND_INF_CAN_SPEAK_ZORA }, { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, + { RG_ROCS_FEATHER, RAND_INF_OBTAINED_ROCS_FEATHER }, { RG_GUARD_HOUSE_KEY, RAND_INF_GUARD_HOUSE_KEY_OBTAINED }, { RG_MARKET_BAZAAR_KEY, RAND_INF_MARKET_BAZAAR_KEY_OBTAINED }, { RG_MARKET_POTION_SHOP_KEY, RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED }, diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index f9a3b3f231..133b179904 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -436,8 +436,6 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe } else { return Flags_GetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN; } - case RG_ROCS_FEATHER: - return Flags_GetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN; // Bottles case RG_EMPTY_BOTTLE: @@ -1166,7 +1164,6 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { 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. for (Rando::DungeonInfo* dungeon : Rando::Context::GetInstance()->GetDungeons()->GetDungeonList()) { @@ -1191,6 +1188,10 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { if (!ChildTradeSlotOccupied()) { INV_CONTENT(ITEM_TRADE_CHILD) = ITEM_LETTER_ZELDA; } + } else if (item == RG_ROCS_FEATHER) { + if (INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_NONE) { + INV_CONTENT(ITEM_NAYRUS_LOVE) = ITEM_ROCS_FEATHER; + } } else if (item == RG_CHILD_WALLET && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FULL_WALLETS)) { Rupees_ChangeBy(99); @@ -1421,12 +1422,6 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { INV_CONTENT(ITEM_NUT) = ITEM_NUT; AMMO(ITEM_NUT) = static_cast(CUR_CAPACITY(UPG_NUTS)); break; - case RG_ROCS_FEATHER: - Flags_SetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER); - if (INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_NONE) { - INV_CONTENT(ITEM_NAYRUS_LOVE) = ITEM_ROCS_FEATHER; - } - break; case RG_SHADOW_SILVER_BLADES: case RG_SHADOW_SILVER_PIT: case RG_SHADOW_SILVER_SPIKES: diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 02d8e2e31b..7c09509ad0 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -887,7 +887,9 @@ bool HasBossSoul(RandomizerInf bossSoul) { void DrawItem(ItemTrackerItem item) { auto gui = std::dynamic_pointer_cast(Ship::Context::GetRawInstance()->GetWindow()->GetGui()); uint32_t actualItemId = - GameInteractor::IsSaveLoaded() && item.kind == ITEM_KIND_ITEM ? INV_CONTENT(item.id) : (uint8_t)ITEM_NONE; + GameInteractor::IsSaveLoaded() && item.kind == ITEM_KIND_ITEM && item.id < ARRAY_COUNT(gItemSlots) + ? INV_CONTENT(item.id) + : (uint8_t)ITEM_NONE; float iconSize = static_cast(CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36)); bool hasItem = actualItemId != ITEM_NONE; bool hideMax = false; @@ -931,6 +933,17 @@ void DrawItem(ItemTrackerItem item) { actualItemId = item.id; hasItem = Flags_GetRandomizerInf(RAND_INF_GREG_FOUND); break; + case ITEM_NAYRUS_LOVE: + // Roc's Feather shares this slot, so the slot being filled isn't enough + hasItem = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_ROCS_FEATHER) + ? Flags_GetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE) + : actualItemId == ITEM_NAYRUS_LOVE; + break; + case ITEM_FISHING_POLE: + actualItemId = item.id; + hasItem = IS_RANDO && Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND); + itemName = "Fishing Pole"; + break; case ITEM_NONE: // spacer, don't render return; } @@ -947,19 +960,6 @@ void DrawItem(ItemTrackerItem item) { (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_TOTAL) > 0); itemName = "Triforce Piece"; break; - case ITEM_NAYRUS_LOVE: - if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_ROCS_FEATHER)) { - hasItem = Flags_GetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE); - } else if (!IS_RANDO) { - // In non-rando, check if player has Roc's Feather in inventory - for (int i = 0; i < 24; i++) { - if (gSaveContext.inventory.items[i] == ITEM_ROCS_FEATHER) { - hasItem = true; - break; - } - } - } - break; case RG_ROCS_FEATHER: itemName = "Roc's Feather"; break; @@ -1064,10 +1064,6 @@ void DrawItem(ItemTrackerItem item) { case RG_OCARINA_C_RIGHT_BUTTON: itemName = "Ocarina C Right Button"; break; - case ITEM_FISHING_POLE: - hasItem = IS_RANDO && Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND); - itemName = "Fishing Pole"; - break; case RG_GUARD_HOUSE_KEY: itemName = "Guard House Key";